Cod sursa(job #695286)

Utilizator GodstormBotarleanu Robert Godstorm Data 28 februarie 2012 11:39:05
Problema Ubuntzei Scor 25
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include<cstdio>
#include<iostream>
#define INT_MAX 99999
using namespace std;

FILE *fin=fopen("ubuntzei.in","r");
FILE *fout=fopen("ubuntzei.out","w");

int n,m,k,K[16],i,j,ct,cmin=INT_MAX;
int cost[2001][2001],distante[16][2001];
int x[17];
int dist[1001],viz[1001],tata[1001];

int test(int k)
{
	for(int i=1;i<k;i++)
		if(x[i]==x[k]) return 0;
	return 1;
}
int bk(int k1)
{
	x[k1]=0;
	while(x[k1]<k)
		{
			x[k1]++;
			if(test(k1)){
							if(k1>1)ct+=distante[x[k1-1]][K[x[k1]]];
							if(k1==k) {
							/*	for(int i=1;i<=k;i++)
											fprintf(fout,"%d ",K[x[i]]);
								fprintf(fout,"\n%d\n\n",ct);*/
								cmin=min(cmin,ct+distante[0][K[x[1]]]+distante[x[k]][n]);
									  }
							else bk(k1+1);
							if(k1>1)ct-=distante[x[k1-1]][K[x[k1]]];
						}
		}
}
						
int minim()
{
	int cmin=INT_MAX;int poz;
	for(int i=1;i<=n;i++)
		if(dist[i]<cmin && viz[i]==0){cmin=dist[i];poz=i;}
	return poz;
}
void dijkstra(int start)
{
	int i,j;
	for(i=1;i<=n;i++) viz[i]=0;
	viz[start]=1;
	for(i=1;i<=n;i++)
		{
			dist[i]=cost[start][i];
		}
	for(i=1;i<n;i++)
		{
			int x=minim();
			viz[x]=1;
			for(j=1;j<=n;j++)
				if(dist[j]>dist[x]+cost[x][j] && cost[x][j]!=INT_MAX)
					{
						dist[j]=dist[x]+cost[x][j];
					}
		}
}
int main()
{
	fscanf(fin,"%d%d%d",&n,&m,&k);
	for(i=1;i<=k;i++)
		fscanf(fin,"%d",&K[i]);
	for(i=1;i<=m;i++)
		{
			int x1,y1,ct;
			fscanf(fin,"%d%d%d",&x1,&y1,&ct);
			cost[x1][y1]=cost[y1][x1]=ct;
		}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(cost[i][j]==0 && i!=j) cost[i][j]=INT_MAX;
	dijkstra(1);
	for(i=1;i<=n;i++)
		distante[0][i]=dist[i];
	for(i=1;i<=k;i++)
		{
			dijkstra(K[i]);
			for(int j=1;j<=n;j++)
				distante[i][j]=dist[j];
		}
/*	for(i=0;i<=k;i++)
		{
			fprintf(fout,"\n");
			for(j=1;j<=n;j++)
				fprintf(fout,"%d ",distante[i][j]);
		}*/
	if(k!=0){
	bk(1);
	fprintf(fout,"%d",cmin);}
	else fprintf(fout,"%d",cost[1][n]);
}