Pagini recente » Cod sursa (job #1628593) | Cod sursa (job #3130191) | Cod sursa (job #1279338) | Cod sursa (job #848310) | Cod sursa (job #1208462)
#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;
Q.push(mp(0, mp(0, 0)));
while(Q.size())
{
pair<int, int> aux=Q.top().second;
x=aux.first;
y=aux.second;
Q.pop();
if(viz2[x][y])
continue;
viz2[x][y]=1;
for(i=1;i<=k+1;i++)
{
if(i==k+1)
mask=y;
else
mask=y|(1<<(i-1));
if(b[i][mask]>b[x][y]+d[x][i])
{
b[i][mask]=b[x][y]+d[x][i];
Q.push(mp(-b[i][mask], mp(i, mask)));
}
}
}
fout<<b[k+1][(1<<k)-1];
}