Pagini recente » Cod sursa (job #2193451) | Cod sursa (job #1947368) | Cod sursa (job #364575) | Cod sursa (job #313741) | Cod sursa (job #1452387)
#include<stdio.h>
#include<stdlib.h>
typedef struct nod{
int val;
int cost;
nod *next;
}nod;
#define INT_MAX 100000
int * dijkstra(nod **a,int n,int k)
{
int *tata=(int *)malloc((n+2)*sizeof(int)),
*distante=(int *)malloc((n+2)*sizeof(int)),
*viz=(int *)malloc((n+2)*sizeof(int));
for(int i=1;i<=n;i++)
{
distante[i]=INT_MAX;
viz[i]=0;
tata[i]=0;
}
nod*p=a[k];
while (p)
{
distante[p->val]=p->cost;
tata[p->val]=k;
p=p->next;
}
viz[k]=1;
int z,min;
for(int i=1;i<n;i++)
{
min=INT_MAX;
for(int j=1;j<=n;j++)
{
if(distante[j]<min && viz[j]==0)
{
min=distante[j];
z=j;
}
}
viz[z]=1;
for(p=a[z];p;p=p->next)
{
if(viz[p->val]==0 && distante[z]+p->cost<distante[p->val])
{
distante[p->val]=distante[z]+p->cost;
tata[p->val]=z;
}
}
}
return distante;
}
int main()
{
FILE*f=fopen("ubuntzei.in","r"),*fout=fopen("ubuntzei.out","w");
int n,m,k,*v;
fscanf(f,"%d",&n);
fscanf(f,"%d",&m);
fscanf(f,"%d",&k);
v=(int *)malloc(k*sizeof(int));
for(int i=0;i<k;i++)
fscanf(f,"%d",&v[i]);
nod **a=(nod**)malloc((n+2)*sizeof(nod*));
for(int i=1;i<=n;i++)
a[i]=NULL;
int x,y,z;
for(int i=1;i<=m;i++)
{
fscanf(f,"%d",&x);
fscanf(f,"%d",&y);
fscanf(f,"%d",&z);
nod*p=(nod*)malloc(sizeof(nod)),*r=(nod*)malloc(sizeof(nod));
p->val=y;
p->next=r->next=NULL;
p->cost=r->cost=z;
r->val=x;
if(a[x]==NULL)
{
a[x]=p;
}
else
{
nod *q=a[x];
while (q->next)
{
q=q->next;
}
q->next=p;
}
if(a[y]==NULL)
{
a[y]=r;
}
else
{
nod *q=a[y];
while (q->next)
{
q=q->next;
}
q->next=r;
}
}
int **mat=(int **)malloc((n+2)*sizeof(int*));
for(int i=1;i<=n;i++)
{
mat[i]=dijkstra(a,n,i);
}
int j,d=0,min,c;
int b=1;
for(int l=0;l<k;l++)
{
min=INT_MAX;
for(int i=0;i<k;i++)
{
if(v[i] && mat[b][v[i]]<min)
{
min=mat[b][v[i]];
j=v[i];
z=i;
}
}
c=j;
v[z]=0;
b=j;
d+=min;
}
d+=mat[c][n];
fprintf(fout,"%d",d);
fclose(f);
fclose(fout);
return 0;
}