Pagini recente » Cod sursa (job #2222721) | Cod sursa (job #2379628) | Cod sursa (job #2534255) | Cod sursa (job #2227849) | Cod sursa (job #1858304)
#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 dist[Kmax][Nmax],stops[Kmax],dp[Kmax][1<<Kmax],distk[Kmax][Kmax],indx[Nmax];
void dijkstra(int v,int d[])
{
priority_queue <pair<int,int>,vector<pair<int,int> >, greater<pair<int,int> > > pq;
for(int i=0;i<=n;i++)
d[i]=INF;
d[v]=0;
pq.push(make_pair(d[v],v));
int cost,w,cost2;
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!=v && indx[i])
{
distk[indx[i]-1][indx[v]-1]=d[i];
distk[indx[v]-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],dist[i]);
/*for(int j=1;j<=n;j++)
{
if(j!=stops[i] && indx[j]!=0)
{
distk[indx[i]-1][indx[stops[i]]-1]=dist[i][j];
distk[indx[stops[i]]-1][indx[i]-1]=dist[i][j];
}
}*/
}
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 k = 0; k < a[j].size(); ++k)
if (i & (1<<a[j][k]))
dp[i][j] = min(dp[i][j], dp[i ^ (1<<j)][ a[j][k] ] + distk[ a[j][k] ][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;
}