Cod sursa(job #580758)

Utilizator APOCALYPTODragos APOCALYPTO Data 13 aprilie 2011 14:14:33
Problema Ubuntzei Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.57 kb
using namespace std;
#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
#include<algorithm>
struct nod
{
	int lg,c;
};
ofstream fout("ubuntzei.out");
int N,M,K,S,T;
#define oo 0x3f3f3f3f
#define nmax 220
#define pb push_back
int dp[220][nmax];
int isinq[nmax];
int H[nmax];
int fr[nmax];
vector<nod> G[nmax];
vector<nod> GT[nmax];
queue<int> q;

void bellman()
{
	int i;
	for(i=0;i<=N;i++)
	{
		dp[T][i]=oo;
		isinq[i]=0;
	}
	dp[T][S]=0;
	q.push(S);
	isinq[S]=1;
	int u;
	vector<nod>::iterator it; ////
	while(!q.empty())
	{
		u=q.front();
		q.pop();

		isinq[u]=0;
		for(it=G[u].begin();it<G[u].end();it++)
		{
			if(dp[T][it->lg]>dp[T][u]+it->c)
			{
				dp[T][it->lg]=dp[T][u]+it->c;
				if(!isinq[it->lg])
				{
					q.push(it->lg);
					isinq[it->lg]=1;
				}
			}
		}
	}
	//cout<<"distanta de la "<<T<<"la"<<"\n";
	/*for(i=1;i<=N;i++)
	{
		cout<<dp[T][i]<<" ";
	}
	cout<<"\n";*/
}

void cit()
{
	ifstream fin("ubuntzei.in");
	fin>>N>>M;
	fin>>K;
	int i;

	for(i=1;i<=K;i++)
	{
		fin>>fr[i];
		//H[fr[i]]=i;
	}
	sort(fr+1,fr+1+K);
	for(i=1;i<=K;i++)
	{

		H[fr[i]]=i;
	}
	int x,y,c;
	for(i=1;i<=M;i++)
	{
		fin>>x>>y>>c;
		G[x].pb((nod){y,c});
		G[y].pb((nod){x,c});

	}
	/*for(i=1;i<=N;i++)
	{
		cout<<i<<"\n";
		for(int j=0;j<G[i].size();j++)
		{
			cout<<G[i][j].lg<<" "<<G[i][j].c<<"\n";
		}
		cout<<"\n";
	}*/
	S=1;
	T=1;
	bellman();
	if(K==0)
	{	 fout<<dp[T][N]<<"\n";
	return;}
	/*for(i=1;i<=K;i++)
	{
		GT[1].pb((nod){fr[i],dp[T][fr[i]]});
		GT[fr[i]].pb((nod){1,dp[T][fr[i]]});
	}*/

    for(i=1;i<=K;i++)
	{
		T=fr[i];
		S=fr[i];
		bellman();
		/*for(j=1;j<=K;j++)
		{
			if(i>j)
			G[fr[i]].pb((nod){fr[j],dp[T][fr[j]]);
			G[fr[j]].pb((nod){fr[i],dp[T][fr[j]]);

		}*/
		//cout<<dp[0][fr[i]]+dp[T][N]<<"\n";
	}

    int ans=0,j,minim=oo;
	ans=0;

		ans=dp[1][fr[1]]+dp[fr[K]][N];

		for(j=1;j<=K-1;j++)
		{
			ans+=dp[fr[j]][fr[j+1]];

		}
		/*cout<<1<<" "<<fr[1]<<"::"<<dp[1][fr[1]]<<"\n";
		for(j=1;j<=K-1;j++)
		{
			cout<<fr[j]<<" "<<fr[j+1]<<"::"<<dp[fr[j]][fr[j+1]]<<" ";
		}
		cout<<"\n";*/

		minim=min(minim,ans);

    for(i=1;next_permutation(fr+1,fr+K+1);i++)
	{
		ans=0;
		ans=dp[1][fr[1]]+dp[fr[K]][N];
		for(j=1;j<=K-1;j++)
		{
			//cout<<fr[j]<<" ";
			ans+=dp[fr[j]][fr[j+1]];

		}
		/*for(j=1;j<=K-1;j++)
		{
			cout<<fr[j]<<" "<<fr[j+1]<<"::"<<dp[fr[j]][fr[j+1]]<<" ";
		}
		cout<<"\n";*/
		minim=min(minim,ans);
	}

	fout<<minim<<"\n";
}

int main()
{
	cit();
	//solve();
	fout.close();
	return 0;
}