Pagini recente » Cod sursa (job #2541746) | Cod sursa (job #961303) | Cod sursa (job #1411328) | Cod sursa (job #179656) | Cod sursa (job #1858315)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <utility>
#include <vector>
#define Nmax 2010
#define Kmax 18
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
int n,m,k;
const int INF=1<<30;
vector <pair<int,int> > adj[Nmax];
int d[Nmax],stops[Kmax],dp[1<<Kmax+4][Kmax],distk[Kmax][Kmax],indx[Nmax];
void dijkstra(int start)
{
priority_queue <pair<int,int>,vector<pair<int,int> >, greater<pair<int,int> > > pq;
int cost,w,cost2,v=start;
for(int i=0;i<=n;i++)
d[i]=INF;
d[v]=0;
pq.push(make_pair(d[v],v));
while(!pq.empty())
{
v=pq.top().second;
cost=pq.top().first;
pq.pop();
for(int i=0;i<adj[v].size();i++)
{
cost2=adj[v][i].first;
w=adj[v][i].second;
if(d[w]>cost2+cost)
{
d[w]=cost2+cost;
pq.push(make_pair(d[w],w));
}
}
}
for(int i=1;i<=n;i++)
{
if(i!=start && indx[i])
{
distk[indx[i]-1][indx[start]-1]=d[i];
distk[indx[start]-1][indx[i]-1]=d[i];
}
}
}
int main()
{
int val;
f >> n >> m >> k;
for(int i=1;i<=k;i++){
f>> val;
stops[i+1]=val;
indx[val]=i+1;
}
indx[1]=1;
indx[n]=k+2;
stops[1]=1;
stops[k+2]=n;
int x,y,c;
for(int i=0;i<m;i++)
{
f>> x >> y >> c;
adj[x].push_back(make_pair(c,y));
adj[y].push_back(make_pair(c,x));
}
int N=k+2;
for(int i=1;i<=N;i++)
{
dijkstra(stops[i]);
}
for(int i=0;i<(1<<N);i++)
for(int j=0;j<=N;j++)
dp[i][j]=INF;
/*vector<int> a[Kmax];
for(int i=0;i<=N;i++)
for(int j=0;j<=N;j++)
if(i!=j)
a[i].push_back(j);*/
dp[1][0]=0;
for (int i = 0; i < 1 << N;i++)
for (int j = 0; j < N; j++)
if (i & (1<<j))
for (int t = 0; t < N;t++)
if (t!=j &&i & (1<<t))
dp[i][j] = min(dp[i][j], dp[i ^ (1<<j)][t] + distk[t][j]);
g << dp[(1<<N)-1][N-1];
/*cout << dp[1][0] <<"\n";
for (int i = 0; i < (1 << N); ++i){
for (int j = 0; j < N; ++j)
cout << dp[i][j] << " ";
cout << "\n";
}*/
return 0;
}