Pagini recente » Cod sursa (job #71993) | Cod sursa (job #1368390) | Cod sursa (job #2426416) | Cod sursa (job #874264) | Cod sursa (job #887271)
Cod sursa(job #887271)
#include <fstream>
#include <iostream>
#include <vector>
#include <list>
#define INF (1<<30)
#define nmax 2001
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
vector< pair <int, int> > v[nmax];
list <int> q;
int n,k,dist[16][nmax],dp[1<<16][nmax],p[16];
int main()
{
int i,j,l,m,x,y,c;
f>>n>>m>>k;
for(i=1;i<=k;i++) f>>p[i];
for(i=0;i<m;i++)
{
f>>x>>y>>c;
v[x].push_back(make_pair(y,c));
v[y].push_back(make_pair(x,c));
}
p[0]=1;
for(i=0;i<=k;i++)
{
dist[i][p[i]]=0;
q.push_back(p[i]);
while(!q.empty())
{
x=q.front();
for(j=0;j<v[x].size();j++)
{
y=v[x][j].first;
m=v[x][j].second;
if(dist[i][x]+m<dist[i][y] || (!dist[i][y] && y!=p[i]))
{
dist[i][y]=dist[i][x]+m;
q.push_back(y);
}
}
q.pop_front();
}
}
if(!k) g<<dist[0][n];
for(i=1;i<(1<<k);i++)
for(j=0;j<k;j++) dp[i][j+1]=INF;
for(i=1;i<(1<<k);i++)
{
for(j=0;j<k;j++)
{
if((1<<j)&i)
{
if((1<<j)==i)
dp[i][j+1]=dist[0][p[j+1]];
else
for(l=0;l<k;l++)
{
if(((1<<l)&i) && l!=j)
if(dp[i-(1<<j)][l+1]+dist[j+1][p[l+1]]<dp[i][j+1])
dp[i][j+1]=dp[i-(1<<j)][l+1]+dist[j+1][p[l+1]];
}
}
}
}
int sol=(1<<30);
for(i=1;i<=k;i++)
{
if(dp[(1<<k)-1][i]+dist[i][n]<sol)
sol=dp[(1<<k)-1][i]+dist[i][n];
}
g<<sol;
}