Pagini recente » Istoria paginii runda/bkt2_oct2011 | Cod sursa (job #2451043) | Cod sursa (job #1534441) | Cod sursa (job #1982344) | Cod sursa (job #1650894)
#include <bits/stdc++.h>
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
#define INF 9999999999
struct muc
{
int y,c;
} A[10008];
vector <muc> v[2011];
long long n,m,k,viz[18],a,b,cost,dp[1<<18][19],lt,d[2011],mat[20][20];
queue <int> Q;
void bell(int nod)
{
for(int i=1; i<=n; i++)
d[i]=-1;
d[nod]=0;
Q.push(nod);
while(!Q.empty())
{
int x=Q.front();
Q.pop();
for(int i=0; i<v[x].size(); i++)
if(d[v[x][i].y]==-1||d[v[x][i].y]>d[x]+v[x][i].c)
{
d[v[x][i].y]=d[x]+v[x][i].c;
Q.push(v[x][i].y);
}
}
}
int main()
{
in>>n>>m;
in>>k;
for(int i=1; i<=k; i++)
in>>viz[i];
while(m--)
{
in>>a>>b>>cost;
v[a].push_back({b,cost});
v[b].push_back({a,cost});
}
int lt=k+2;
bell(1);
if(k==0){out<<d[n]<<" ";return 0;}
for(int j=1; j<=k; j++)
mat[0][j]=mat[j][0]=d[viz[j]];
mat[0][k+1]=mat[k+1][0]=d[n];
for(int i=1; i<=k; i++)
{
bell(viz[i]);
for(int j=1; j<=k; j++)
mat[i][j]=mat[j][i]=d[viz[j]];
mat[i][k+1]=mat[k+1][i]=d[n];
mat[0][i]=mat[i][0]=d[1];
}
bell(n);
for(int j=1; j<=k; j++)
mat[k+1][j]=mat[j][k+1]=d[viz[j]];
mat[0][k+1]=mat[k+1][0]=d[1];
for(int i=1; i<=n; i++)
if(k==0)
{
out<<d[n];
return 0;
}
for(int i=0; i<=(1<<lt); i++)
for(int j=0; j<=lt; j++)
dp[i][j]=INF;
dp[1][0]=0;
for(int i=0; i<(1<<lt); i++)
for(int j=0; j<lt; j++)
if(i&(1<<j))
for(int k=0; k<lt; k++)
if(i&(1<<k))
if(dp[i][j]==-1)dp[i][j]=dp[i-(1<<j)][k]+mat[j][k];
else dp[i][j]=min(dp[i][j],dp[i-(1<<j)][k]+mat[j][k]);
out<<dp[(1<<lt)-1][k+1];
return 0;
}