Pagini recente » Cod sursa (job #1999247) | Cod sursa (job #232871) | Profil M@2Te4i | Cod sursa (job #2048718) | Cod sursa (job #1770070)
#include <iostream>
#include<fstream>
#include<queue>
#include<vector>
using namespace std;
struct nodeDist
{
int node,d;
}el;
struct CMP
{
bool operator()(nodeDist unu,nodeDist doi)
{
return unu.d>doi.d;
}
};
priority_queue<nodeDist,vector<nodeDist>,CMP> q;
const int nmax=2005;
vector< pair<int,int> > v[nmax];
int cost[nmax],x,y,z,i,n,m,j,k,ind,start,dist,l[20],cnt,fix;
long long c[20][20],distN[20],best[(1<<15)+5][20],mn;
void dijkstra(int x)
{
for(i=1;i<=n;i++)
{
cost[i]=(1<<30);
}
cost[x]=0;
el.node=x;el.d=0;
q.push(el);
while(!q.empty())
{
start=q.top().node;
dist=q.top().d;
q.pop();
for(i=0;i<v[start].size();i++)
{
el.node=v[start][i].first;
el.d=v[start][i].second+dist;
if(el.d<cost[el.node])
{
cost[el.node]=el.d;
q.push(el);
}
}
}
}
int main()
{
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
f>>n>>m;
f>>k;
for(i=1;i<=k;i++)
f>>l[i];
for(i=1;i<=m;i++)
{
f>>x>>y>>z;
v[x].push_back(make_pair(y,z));
v[y].push_back(make_pair(x,z));
}
dijkstra(1);
if(k==0) {g<<cost[n];return 0;}
for(i=0;i<k;i++)
{
best[(1<<i)][i]=cost[l[i+1]];
}
for(cnt=1;cnt<=k;cnt++)
{
dijkstra(l[cnt]);
for(i=0;i<k;i++)
{
c[cnt-1][i]=cost[l[i+1]];
}
distN[cnt-1]=cost[n];
}
fix=(1<<k);mn=(1<<30);
for(i=1;i<fix;i++)
for(j=0;j<k;j++)
if(i&(1<<j))
{
for(ind=0;ind<k;ind++)
{
if((i&(1<<ind))==0)
{
if(best[i+(1<<ind)][ind]==0||best[i][j]+c[j][ind]<best[i+(1<<ind)][ind])
{
best[i+(1<<ind)][ind]=best[i][j]+c[j][ind];
}
}
}
}
for(i=0;i<k;i++)
{
if(best[fix-1][i]+distN[i]<mn)
mn=best[fix-1][i]+distN[i];
}
g<<mn;
return 0;
}