Pagini recente » Cod sursa (job #915445) | Cod sursa (job #1513637) | Cod sursa (job #3217747) | Cod sursa (job #1928871) | Cod sursa (job #881768)
Cod sursa(job #881768)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define INF 999999999
using namespace std;
int n,m,k;
vector< pair<int,int> > G[2010];
queue<int> Q;
int d[17][2010];
int sol[1<<16][16];
int v[16];
int get_min(int x,int next)
{
if(x==0)
return d[0][next];
int minx = INF;
for(int dr=0;dr<k;dr++)
if((x & (1<<dr)) == (1<<dr))
if(minx > sol[x][dr] + d[dr+1][next])
minx = sol[x][dr] + d[dr+1][next];
return minx;
}
int main()
{
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
fin>>n>>m>>k;
for(int i=1;i<=k;i++)
fin>>v[i];
int x,y,c;
for(int i=1;i<=m;i++)
{
fin>>x>>y>>c;
G[x].push_back(make_pair(y,c));
G[y].push_back(make_pair(x,c));
}
for(int i=0;i<=k;i++)
for(int j=1;j<=n;j++)
d[i][j]=INF;
v[0]=1;
for(int p=0;p<=k;p++)
{
Q.push(v[p]);
d[p][v[p]]=0;
while(!Q.empty())
{
int nod=Q.front();Q.pop();
for(int i=0;i<G[nod].size();i++)
if(d[p][nod]+G[nod][i].second<d[p][G[nod][i].first])
{
Q.push(G[nod][i].first);
d[p][G[nod][i].first]=d[p][nod]+G[nod][i].second;
}
}
}
for(int nr=1;nr<(1<<k);nr++)
{
for(int p=0;p<k;p++)
if((nr & (1<<p)) == (1<<p))
{
sol[nr][p]=get_min(nr-(1<<p),v[p+1]);
}
}
fout<<get_min((1<<k)-1,n);
return 0;
}