Cod sursa(job #702042)

Utilizator i.anna_mIlusca Ana-Maria i.anna_m Data 1 martie 2012 19:11:56
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include<stdio.h>
FILE *f,*g;
int d[2001][2001],min,n,m,s,ka,kar[2][16],c[2001][2001],M[16][2001];
int main()
{
	f=fopen("ubuntzei.in","r");
	g=fopen("ubuntzei.out","w");
	fscanf(f,"%d%d%d",&n,&m,&ka);
	register int i,k,j;
	kar[0][0]=1;
	for(i=1;i<=ka;++i)
		fscanf(f,"%d",&kar[0][i]);
	for(i=1;i<=n;++i)
		for(j=1;j<=n;++j)
			if(i!=j)
				c[i][j]=999999999;
		int a,b,e,l;
	for(i=0;i<m;++i)
	{
		fscanf(f,"%d%d%d",&a,&b,&e);
		c[a][b]=e;
		c[b][a]=e;
	}
	for(i=0;i<=ka;++i)
	{
		/*for(j=0;j<=n;++j)
			M[j]=0;*/
		//u=1;
		
		//c[kar[i]][kar[i]]=0;
		M[i][kar[0][i]]=1;
		for(j=1;j<=n;++j)
			d[i][j]=c[kar[0][i]][j];
		for(j=1;j<n;++j)
		{
			min=99999999;
			//a=0;
			for(k=1;k<=n;++k)
			{
				if(M[i][k]==0 && min>d[i][k])
				{
					min=d[i][k];
					a=k;
				}
			}
			M[i][a]=1;
			for(k=1;k<=n;++k)
			{
				if(M[i][k]==0 && d[i][k]>d[i][a]+c[a][k] && i!=k)
					d[i][k]=d[i][a]+c[a][k];
			}
		}
	}
	if(ka==0)
		fprintf(g,"%d",d[0][n]);
	else
	{
		a=0;
		s=0;
		b=0;
		while(a!=n)
		{
			min=99999999;
			if(a==kar[0][ka])
			{
				s+=d[b][n];
				a=n;
			}
			else
			{
				for(i=1;i<=ka;i++)
					if(d[b][kar[0][i]]<min && b!=i && kar[1][i]==0)
					{
						min=d[b][kar[0][i]];
						a=kar[0][i];
						kar[1][i]=1;
						e=i;
					}
				s+=d[b][a];
				b=e;
			}
		}
		fprintf(g,"%d",s);
	}
}