Pagini recente » Cod sursa (job #2157849) | Cod sursa (job #1532576) | Cod sursa (job #3217848) | Cod sursa (job #2998949) | Cod sursa (job #1208511)
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
#define MAXN 2003
#define MAXK 17
#define mp make_pair
#define pb push_back
#define INF 1<<30
typedef vector <pair<int, int> > :: iterator iter;
vector<pair<int, int> > G[MAXN], S[MAXK];
priority_queue <pair<int, int> > H;
priority_queue <pair<int, pair<int, int> > > Q;
int n, dist[MAXN], viz[MAXN], k, d[MAXK][MAXK], a[MAXK], b[MAXK][1<<MAXK], viz2[MAXK][1<<MAXK];
void Djakistra(int index, int nod)
{
int i;
for(i=1;i<=n;i++)
{
dist[i]=INF;
viz[i]=0;
}
dist[nod]=0;
H.push(mp(0, nod));
while(H.size())
{
nod=H.top().second;
H.pop();
if(viz[nod])
continue;
viz[nod]=1;
for(iter it=G[nod].begin();it!=G[nod].end();it++)
{
if(dist[it->first]>dist[nod]+it->second)
{
dist[it->first]=dist[nod]+it->second;
H.push(mp(-dist[it->first], it->first));
}
}
}
for(i=0;i<=k+1;i++)
{
d[index][i]=dist[a[i]];
}
}
int main()
{
int i, m, x, y, c, j, mask;
fin>>n>>m;
fin>>k;
for(i=1;i<=k;i++)
fin>>a[i];
while(m--)
{
fin>>x>>y>>c;
G[x].pb(mp(y, c));
G[y].pb(mp(x, c));
}
a[0]=1;
a[k+1]=n;
for(i=0;i<=k+1;i++)
{
Djakistra(i, a[i]);
}
/*for(i=0;i<=k+1;i++)
{
for(j=0;j<=k+1;j++)
{
cout<<d[i][j]<<" ";
}
cout<<"\n";
}*/
for(i=0;i<=k+1;i++)
{
for(j=0;j<(1<<k);j++)
{
b[i][j]=INF;
}
}
b[0][0]=0;
for(mask=1;mask<(1<<k);mask++)
{
for(i=1;i<=k;i++)
{
if(mask&(1<<(i-1)))
{
if(mask==(1<<(i-1)))
{
b[i][mask]=d[0][i];
}
else
for(j=1;j<=k;j++)
{
if(mask&(1<<(j-1)) && i!=j)
{
//j, mask&(~(1<<(i-1))) -> i, mask
b[i][mask]=min(b[i][mask],b[j][mask&(~(1<<(i-1)))] + d[j][i]);
}
}
}
}
}
x=INF;
if(k==0)
x=d[0][k+1];
for(i=1;i<=k;i++)
{
x=min(x, b[i][(1<<k)-1]+d[i][k+1]);
}
fout<<x;
}