Pagini recente » Cod sursa (job #1710123) | Cod sursa (job #2525230) | Cod sursa (job #3005420) | Cod sursa (job #1889177) | Cod sursa (job #580758)
Cod sursa(job #580758)
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;
}