Pagini recente » Cod sursa (job #221200) | Cod sursa (job #2599283) | Cod sursa (job #2075692) | Cod sursa (job #264389) | Cod sursa (job #2700605)
#include <stdio.h>
#include <vector>
#include <utility>
#include <queue>
#define NMAX 2005
#define INF 1e9
using namespace std;
FILE *fin = fopen("ubuntzei.in", "r");
FILE *fout = fopen("ubuntzei.out", "w");
vector <pair <int,int> > graf[NMAX];
vector <vector <int> > d,dp;
vector <int> trb,D;
int n,m,k,i,j,x,y,c,mask,ans;
void dijkstra(int start, vector <int> &dist)
{
priority_queue <pair<int, int> > q;
int nod,lg,i;
q.push(make_pair(0, start));
dist.assign(n+1, INF);
dist[start]=0;
while(!q.empty())
{
nod = q.top().second;
lg = q.top().first;
if(dist[nod]==lg){
for(i=0; i<graf[nod].size(); ++i)
if(lg+graf[nod][i].second < dist[graf[nod][i].first])
{
dist[graf[nod][i].first] = lg+graf[nod][i].second;
q.push(make_pair(dist[graf[nod][i].first], graf[nod][i].first));
}
}
q.pop();
}
}
int main()
{
fscanf(fin, "%d%d%d", &n,&m,&k);
trb.resize(k);
for(i=0; i<=k-1; ++i)
fscanf(fin, "%d", &trb[i]);
for(i=1; i<=m; ++i)
{
fscanf(fin, "%d%d%d", &x,&y,&c);
graf[x].push_back(make_pair(y,c));
graf[y].push_back(make_pair(x,c));
}
D.resize(n);
dijkstra(1, D);
d.resize(k);
for(i=0; i<=k-1; ++i)
dijkstra(trb[i], d[i]);
dp.assign(1<<k, vector <int> (k, INF));
for(i=0; i<=k-1; ++i)
dp[1<<i][i] = D[trb[i]];
for(mask=1; mask<=(1<<k)-1; ++mask)
for(i=0; i<=k-1; ++i)
if(mask & (1<<i))
for(j=0; j<=k-1; ++j)
if(i!=j and mask & (1<<j) and dp[mask ^ (1<<i)][j] + d[i][trb[j]] < dp[mask][i])
dp[mask][i] = dp[mask ^ (1<<i)][j] + d[i][trb[j]];
ans = INF;
for(i=0; i<=k-1; ++i)
ans = min(ans, dp[(1<<k) - 1][i]+d[i][n]);
fprintf(fout, "%d", ans);
fclose(fin);
fclose(fout);
return 0;
}