Cod sursa(job #669925)

Utilizator RengelBotocan Bogdan Rengel Data 28 ianuarie 2012 00:08:40
Problema Ubuntzei Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include<cstdio>
#include<climits>

#define inf 2005

int A[inf][inf];
int m,n,k,sum;
int S[20];
int F[20];

void read(){
	
	freopen("ubuntzei.in","r",stdin);
	
	scanf("%d%d%d",&n,&m,&k);
	
	for(int i=1;i<=k;i++)
		scanf("%d",&S[i]);
	
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			A[i][j]=inf;
	
	int x,y,c;
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&x,&y,&c);
		A[x][y]=A[y][x]=c;
	}
	
	fclose(stdin);
	
}

void roy_floyd(){
	
	for(int k=1;k<=n;k++)
		for(int i=1;i<=n;i++)
			for(int j=i+1;j<=n;j++)
				if(A[i][k]+A[k][j]<A[i][j])
					A[i][j]=A[j][i]=A[i][k]+A[k][j];
	
}

void solve(){
	
	int nod_pornire = 1;
	int nod_destinatie = n;
	
	int min1;
	int min2;
	int poz1;
	int poz2;
	
	
	for(int i=1;i<=k;i++){
		min1=INT_MAX;
		for(int j=1;j<=k;j++)
			if(A[nod_pornire][S[j]]<min1 && !F[j]){
				min1=A[nod_pornire][S[j]];
				poz1=j;
			}
		
		min2=INT_MAX;
		for(int j=1;j<=k;j++)
			if(A[nod_destinatie][S[j]]<min2 && !F[j]){
				min2=A[nod_destinatie][S[j]];
				poz2=j;
			}
		
		if(min1<min2){
			F[poz1]++;
			sum+=min1;
			nod_pornire=S[poz1];
			if(i==k) sum+=min2;
		}
		else{
			F[poz2]++;
			sum+=min2;
			nod_destinatie=S[poz2];
			if(i==k && k%2) sum+=min1;
		}
		
	}
	
	freopen("ubuntzei.out","w",stdout);
	printf("%d",sum);
	fclose(stdout);
	
}

int main(){
	
	read();
	
	roy_floyd();
	
	solve();
	
	return 0;
	
}