Pagini recente » Cod sursa (job #1916181) | Cod sursa (job #2495066) | Cod sursa (job #993065) | Cod sursa (job #824042) | Cod sursa (job #2511070)
#include<fstream>
#include<vector>
#include<algorithm>
#include<queue>
#define INF 2000000000
using namespace std;
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
struct elem
{
int x,c;
bool operator < (const elem &a) const
{
return c>a.c;
}
};
vector<elem>a[50002];
priority_queue<elem>pq;
int v[20],d[20][2002],n,viz[2002],dp[132002];
void dijkstra(int s)
{
int i,l;
elem p;
for(i=1;i<=n;i++)
if(i!=v[s])
d[s][i]=INF;
p.x=v[s];
p.c=0;
pq.push(p);
while(!pq.empty())
{
p=pq.top();
pq.pop();
l=a[p.x].size();
for(i=0;i<l;i++)
if(d[s][a[p.x][i].x]>d[s][p.x]+a[p.x][i].c)
{
d[s][a[p.x][i].x]=d[s][p.x]+a[p.x][i].c;
pq.push(elem{a[p.x][i].x,d[s][a[p.x][i].x]});
}
}
}
int main()
{
int m,k,i,x,y,z,p=1,stare,j;
f>>n>>m>>k;
for(i=1;i<=k;i++)
f>>v[i];
for(i=1;i<=m;i++)
{
f>>x>>y>>z;
a[x].push_back({y,z});
a[y].push_back({x,z});
}
v[0]=1;
v[k+1]=n;
for(i=0;i<=k+1;i++)
dijkstra(i),p*=2;
p--;
for(i=0;i<=p;i++)
dp[i]=INF;
dp[1]=0;
for(stare=1;stare<p;stare++)
if(dp[stare]!=INF)
{
for(i=0;i<=k+1;i++)
if((stare&(1<<i))!=0)
{
for(j=0;j<=k+1;j++)
if((stare&(1<<j))==0)
dp[(stare|(1<<j))]=min(dp[(stare|(1<<j))],dp[stare]+d[i][v[j]]);
}
}
g<<dp[p];
return 0;
}