Cod sursa(job #848626)

Utilizator dragangabrielDragan Andrei Gabriel dragangabriel Data 5 ianuarie 2013 17:35:02
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include<cstdio>
#include<vector>
#include<deque>
#include<cstring>
#include<algorithm>
#define inf 999999999
using namespace std;
int rez,n,i,j,k,m,a,b,x,y,mat[2005][2005],cost[2005],q[20],t[20];
vector<pair<int,int> >v[2005];
deque<int>c;
bool viz[2005];

void dijkstra(int x)
{
	memset(viz,false,sizeof(viz));
	memset(cost,0,sizeof(cost));
	viz[x]=true;
	c.push_back(x);
	while (!c.empty())
	{
		x=c.front();
		for (j=0;j<v[x].size();j++)
		{
			a=v[x][j].first;
			b=v[x][j].second;
			if (!viz[a]) viz[a]=true,c.push_back(a),cost[a]=b+cost[x];else
				if (cost[a]>b+cost[x]) cost[a]=cost[x]+b,c.push_back(a);
		}
		c.pop_front();
	}
}
int main()
{
	freopen("ubuntzei.in","r",stdin);
	freopen("ubuntzei.out","w",stdout);
	scanf("%d %d",&n,&m);
	scanf("%d",&k);
	for (i=1;i<=k;i++)scanf("%d",&q[i]);
	for (i=1;i<=m;i++) scanf("%d %d %d",&a,&b,&j),v[a].push_back(make_pair(b,j)),v[b].push_back(make_pair(a,j));
	k++;q[k]=n;q[0]=1;
	for (i=0;i<=k-1;i++)
	{
		dijkstra(q[i]);
		for (j=i+1;j<=k;j++) mat[q[i]][q[j]]=mat[q[j]][q[i]]=cost[q[j]];
	}
	for (i=1;i<=k;i++) t[i]=i;rez=inf;int sum;k--;
	do
	{
		sum=0;
		for (i=1;i<=k;i++) sum+=mat[q[i]][q[i+1]];
		rez=min(rez,sum+mat[1][q[1]]);
	}while(next_permutation(t+1,t+k+1));
	printf("%d\n",rez);
	return 0;
}