Pagini recente » Cod sursa (job #2840238) | Cod sursa (job #2883145) | Cod sursa (job #507879) | Cod sursa (job #1118475) | Cod sursa (job #1116617)
#include <fstream>
#include <vector>
#include <algorithm>
#include <string.h>
#include <queue>
using namespace std;
fstream f("ubuntzei.in",ios::in);
fstream g("ubuntzei.out",ios::out);
const int kmax=20,nmax=2005;
const long long INF=0x3f3f3f3f;
vector < pair<int, int> > a[nmax];
long long d[kmax][kmax],minim;
int n,m,k,x,y,z,nc,i,j,tr[kmax],pr[kmax];
void citire()
{
f>>n>>m;
f>>k;
for (i=1;i<=k;i++) f>>pr[i];
for (i=1;i<=m;i++)
{
f>>x>>y>>z;
a[x].push_back(make_pair(y,z));
a[y].push_back(make_pair(x,z));
}
}
void dijkstra(int p)
{
long long dist[nmax];
int viz[nmax];
memset(dist,INF,sizeof(dist));
memset(viz,0,sizeof(viz));
queue <int> q;
q.push(nc);
dist[nc]=0;
viz[nc]=1;
while (!q.empty())
{
nc=q.front();
q.pop();
viz[nc]=0;
for (vector< pair <int,int> >::iterator it=a[nc].begin();it!=a[nc].end();++it)
if (dist[nc]+it->second<dist[it->first])
{
dist[it->first]=dist[nc]+it->second;
if(!viz[it->first])
{
viz[it->first]=1;
q.push(it->first);
}
}
}
for (j=1;j<=k;j++)
{
d[p][j+1]=dist[pr[j]];
d[j+1][p]=dist[pr[j]];
}
d[p][k+2]=dist[n];
d[k+2][p]=dist[n];
}
void calcul(long long s,int loc,int parc,int trec[kmax])
{
if (parc==k+1)
{
if (s+d[loc][k+2]<minim) minim=s+d[loc][k+2];
}
else for (j=2;j<=k+1;j++) if ((loc!=j)&&(!trec[j]))
{
trec[j]=1;
calcul(s+d[loc][j],j,parc+1,trec);
trec[j]=0;
}
}
int main()
{
citire();
for (i=1;i<=k+2;i++)
for (j=1;j<=k+2;j++) d[i][j]=0;
nc=1;
dijkstra(1);
for (i=1;i<=k;i++) {
nc=pr[i];
dijkstra(i+1);
}
minim=INF;
for (i=1;i<=k+2;i++) tr[i]=0;
tr[1]=1;
calcul(0,1,1,tr);
g<<minim;
f.close();g.close();
return 0;
}