Pagini recente » Cod sursa (job #1819110) | Cod sursa (job #2224727) | Cod sursa (job #1770102) | Cod sursa (job #904788) | Cod sursa (job #955141)
Cod sursa(job #955141)
#include<fstream>
#include<vector>
#include<queue>
#include<iostream>
#include<cstring>
#define pb push_back
//#define nod second
#define INF 0x3f3f3f3f
//#define cost first
#define mp make_pair
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int n,m,k,i,j,conf,x,sol,y,co,c[100100][20],v[20],d[2010][2010];
bool viz[2010];
vector<pair<int,int> >l[2010];
void dijkstra(int s)
{
int i,cost1,nod1;
priority_queue<pair<int,int>, vector<pair<int,int> >, greater<pair<int,int> > > h;
h.push(mp(0,s));
for(i=0;i<n;++i)
d[s][i]=INF;
memset(viz,0,sizeof(viz));
for(i=1;i<=n;++i)
{
nod1=h.top().second;
cost1=h.top().first;
h.pop();
if(viz[nod1])
{
--i;
continue;
}
d[s][nod1]=cost1;
viz[nod1]=1;
for(vector<pair<int,int > >::iterator it=l[nod1].begin(),fin=l[nod1].end();it!=fin;++it)
{
if(!viz[it->first])
h.push(mp(cost1+it->second,it->first));
// cout<<cost1+it->nod<<' '<<it->cost<<'\n';
}
}
}
int main()
{
f>>n>>m>>k;
for(i=0;i<k;++i)
f>>v[i],--v[i];
for(i=1;i<=m;++i)
{
f>>x>>y>>co;
l[x-1].pb(mp(y-1,co));
l[y-1].pb(mp(x-1,co));
}
memset(c,INF,sizeof(c));
dijkstra(0);
c[0][0]=0;
if(k==0)
{
g<<d[0][n-1]<<"\n";
return 0;
}
for(i=0;i<k;++i)
{
dijkstra(v[i]);
c[1<<i][i]=d[0][v[i]];
}
for(conf=1;conf<(1<<k);++conf)
for(i=0;i<k;++i)
if(conf&(1<<i))
for(j=0;j<k;++j)
if(!(conf&(1<<j)))
{
c[conf^(1<<j)][j]=min(c[conf^(1<<j)][j],c[conf][i]+d[v[i]][v[j]]);
}
sol=INF;
for(i=0;i<k;++i)
if(c[(1<<k)-1][i]+d[v[i]][n-1]<sol)
sol=c[(1<<k)-1][i]+d[v[i]][n-1];
g<<sol<<'\n';
}