Pagini recente » Cod sursa (job #2076293) | Cod sursa (job #2338147) | Cod sursa (job #1516364) | Cod sursa (job #839085) | Cod sursa (job #1301686)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define inf 2147000000
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
struct muchie
{ int x,c; } el,newel;
struct cmp
{
bool operator() (muchie a,muchie b)
{ return a.c>b.c; }
};
vector <muchie> v[2005];
int n,m,k,dmin[2005],ord[2005],dist[18][18],nd[18],dp[(1<<16)][16];
priority_queue <muchie,vector<muchie>,cmp> heap;
void Dijkstra(int x,int ind)
{ int i,nod,nod2;
for(i=1;i<=n;i++)
dmin[i]=inf;
dmin[x]=0;
el.x=x; el.c=0; heap.push(el);
while(!heap.empty())
{ el=heap.top(); heap.pop();
if (dmin[el.x]==el.c)
{ nod=el.x;
if (ord[nod] && ind!=ord[nod]) dist[ind][ord[nod]]=el.c;
for(i=0;i<v[nod].size();i++)
if (dmin[nod]+v[nod][i].c<dmin[v[nod][i].x])
{ nod2=v[nod][i].x;
newel.x=nod2;
newel.c=dmin[nod]+v[nod][i].c;
dmin[nod2]=dmin[nod]+v[nod][i].c;
heap.push(newel);
}
}
}
}
int main()
{ int i,j,i2,j2,x,y,nk=0;
f>>n>>m>>k;
nd[1]=1; ord[1]=1; nk=1;
for(i=1;i<=k;i++)
{ nk++;
f>>nd[nk];
ord[nd[nk]]=nk;
}
nk++; ord[n]=nk;
nd[nk]=n;
k=nk;
//for(i=1;i<=k;i++)
// cout<<nd[i]<<" ";
for(i=1;i<=m;i++)
{
f>>x>>y>>el.c;
el.x=y;
v[x].push_back(el);
el.x=x;
v[y].push_back(el);
}
for(i=1;i<=k;i++)
for(j=1;j<=k;j++)
dist[i][j]=inf;
for(i=1;i<=k;i++)
Dijkstra(nd[i],i);
for(i=0;i<(1<<k);i++)
for(j=0;j<k;j++)
dp[i][j]=inf;
dp[(1<<0)][0]=0;
for(i=2;i<(1<<k);i++)
{
if (i&(1<<0))
{
for(j=1;j<k;j++)
if (i&(1<<j) && (i-(1<<j))>0)
{ i2=i-(1<<j);
for(j2=0;j2<k;j2++)
if ((i2&(1<<j2)) && j!=j2)
{
if (dist[j2+1][j+1]!=inf)
dp[i][j]=min(dp[i][j],dp[i2][j2]+dist[j2+1][j+1]);
}
}
}
}
g<<dp[(1<<k)-1][k-1];
return 0;
}