Pagini recente » Cod sursa (job #1844119) | Cod sursa (job #2540568) | Cod sursa (job #1340508) | Cod sursa (job #1082421) | Cod sursa (job #1712003)
#include<iostream>
#include<fstream>
#include <stdlib.h>
using namespace std;
ifstream f("sate.in");
ofstream g("sate.out");
int **init_mat_cost(int n)
{
int **a=(int **)malloc(n*sizeof(int *));
for(int i=0;i<n;i++) a[i]=(int *)calloc(n,sizeof(int));
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
if (i==j) a[i][j]=0;
else if(i<j) a[i][j]=9999;
else if(i>j) a[i][j]=-9999;
return a;
}
int **citire_date(int &n,int &nod1,int &nod2)
{
int m;
f>>n>>m>>nod1>>nod2;
nod1--;
int **a=init_mat_cost(n);
for(int i=0; i<m; i++)
{
int x,y;
f>>x>>y;
f>>a[x-1][y-1];
a[y-1][x-1]=a[x-1][y-1];
}
return a;
}
void init(int **&a,int *&c,int *&viz,int *&prec,int nod1,int n)
{
c=(int *)calloc(n,sizeof(int));
viz=(int *)calloc(n,sizeof(int));
prec=(int *)calloc(n,sizeof(int));
for(int i=0; i<n; i++)
{
c[i]=a[nod1][i];
if (c[i]<9999 && c[i]>-9999&& c[i]!=0) prec[i]=nod1;
else prec[i]=0;
}
viz[nod1]=1;
prec[nod1]=0;
c[nod1]=0;
}
void dijkstra(int **&a,int *&viz,int *&prec,int *&c,int n)
{
int nod,vmin,j,gasit;
do
{
gasit=0;
vmin=9999;
for(j=0; j<n; j++)
if ((viz[j]==0)&&(c[j]<vmin))
{
gasit=1;
vmin=c[j];
nod=j;
}
viz[nod]=1;
for(j=0; j<n; j++)
if(nod<j)
{
if ((viz[j]==0)&&(c[nod]+a[nod][j]<c[j]))
{
c[j]=c[nod]+a[nod][j];
prec[j]=nod;
}
}
else if(nod>j)
{
if ((viz[j]==0)&&(c[nod]-a[nod][j]<c[j]))
{
c[j]=c[nod]-a[nod][j];
}
}
}
while (gasit);
}
int main()
{
int **a,*viz,*c,*pred,n,nod1,nod2;
a=citire_date(n,nod1,nod2);
init(a,c,viz,pred,nod1,n);
dijkstra(a,viz,pred,c,n);
g<<c[nod2-1];
}