Cod sursa(job #665540)

Utilizator andreivFMI - vacaroiu andrei andreiv Data 22 ianuarie 2012 09:41:20
Problema Floyd-Warshall/Roy-Floyd Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.87 kb
#include <cstdio>
int M[42][42],v[10],d[10];
int main()
{
	int n,t,m,i,j,a,b,c,sol=0,x[10];
	
	freopen("subarbore.in","r",stdin);
	freopen("subarbore.out","w",stdout);
	scanf("%d %d",&n,&m);
	for (i=1;i<=m;++i)
		{scanf("%d %d %d",&a,&b,&c);M[a][b]=M[b][a]=c;}
	for (t=1;t<=n;++t)
		for (i=1;i<=n;++i)
			if (M[t][i]!=0)
				for (j=1;j<=n;++j)
					if (M[i][t] && M[t][j] && (M[i][j] > M[i][t] + M[t][j] || !M[i][j]) && i != j) 
						M[i][j]=M[i][t]+M[t][j];
	scanf("%d",&t);
	for (i=1;i<=t;++i)
		scanf("%d",&x[i]);
	v[1]=1;
	d[1]=0;
	for (i=2;i<=t;++i)
		d[i]=M[x[1]][x[i]];
	for (m=1;m<t;++m)
	{
		a=999999999;
		for (i=1;i<=t;++i)
			if ((d[i]) && (d[i]<a)) a=d[i],b=i;
		sol+=a;
		v[b]=1;d[b]=0;
		for (i=1;i<=t;++i)
			if (!v[i])
				if ((d[i]==0) || (d[i]>M[x[b]][x[i]]))
					d[i]=M[x[b]][x[i]];
	}
	printf("%d\n",sol);
return 0;
}