Cod sursa(job #700412)

Utilizator lily3Moldovan Liliana lily3 Data 1 martie 2012 10:08:57
Problema Ubuntzei Scor 45
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.27 kb
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
	FILE *g=fopen("ubuntzei.out","w");

int i,j,n,m,x,y,cost1,d[2010][2010],k,p[2010],c[20],min1=1<<30,uz[20];
struct muchie
{
	int nod,cost;
};
vector<muchie> a[2010];
queue<int> q;
void det(int x)
{
	int i,xx;
	for(i=1;i<=n;++i)
		d[x][i]=1<<30;
	d[x][x]=0;
	q.push(x);
	while(!q.empty())
	{
		xx=q.front();
		for(i=0;i<a[xx].size();++i)
			if(d[x][a[xx][i].nod]>d[x][xx]+a[xx][i].cost)
				d[x][a[xx][i].nod]=d[x][xx]+a[xx][i].cost,q.push(a[xx][i].nod);
			q.pop();
	}
}
void perm(int niv)
{
	if(niv==k+1)
	{
		int sol=0;
		sol+=d[1][p[c[1]]]+d[p[c[k]]][n];
		for(int i=1;i<=k;++i)
			sol+=d[p[c[i]]][p[c[i+1]]];
		if(min1>sol)
			min1=sol;
	}
	else
		for(int i=1;i<=k;++i)
			if(!uz[i])
			{
				uz[i]=1;
				c[niv]=i;
				perm(niv+1);
				uz[i]=0;
			}
}
			
int main()
{
	FILE *f=fopen("ubuntzei.in","r");
	fscanf(f,"%d%d",&n,&m);
	fscanf(f,"%d",&k);
	for(i=1;i<=k;++i)
		fscanf(f,"%d",&p[i]);
	for(i=1;i<=m;++i)
	{
		fscanf(f,"%d%d%d",&x,&y,&cost1);
		a[x].push_back((muchie) {y,cost1});
		a[y].push_back((muchie) {x,cost1});
	}
	for(i=1;i<=n;++i)
	det(i);
	if(k==0)
		fprintf(g,"%d", d[1][n]);
	else
	{
	perm(1);
	fprintf(g,"%d",min1);
	}
	return 0;
}