Pagini recente » Cod sursa (job #677276) | Cod sursa (job #2698418) | Cod sursa (job #3295266) | Istoria paginii runda/dedicatie_speciala7/clasament | Cod sursa (job #875369)
Cod sursa(job #875369)
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <queue>
#define inf 2e8
using namespace std;
int n,a[2013][2013];
vector <pair <int, int> > v[2013];
void bellman(int st, int d[])
{
int nod,i,nodc;
queue <int> q;
q.push(st);
while (!q.empty())
{
nod=q.front();
q.pop();
for (i=0;i<v[nod].size();i++)
{
nodc=v[nod][i].first;
if (d[nodc]==0 || d[nodc]>d[nod]+a[nod][nodc])
{
d[nodc]=d[nod]+a[nod][nodc];
q.push(nodc);
}
}
}
}
int c[20],d[20][2013],cost[20][33000]={inf},m,k,dd[2013];
int min (int q,int w)
{
if (q<w)
return q;
return w;
}
int main()
{
int x,y,z,i,j;
fstream f,g;
f.open("ubuntzei.in",ios::in);
g.open("ubuntzei.out",ios::out);
f>>n>>m;
f>>k;
for (i=0;i<k;i++)
f>>c[i];
for (i=1;i<=m;i++)
{
f>>x>>y>>z;
a[x][y]=a[y][x]=z;
v[y].push_back(make_pair(x,z));
v[x].push_back(make_pair(y,z));
}
bellman(1,dd);
if (k==0)
{
g<<dd[n];
return 0;
}
for (i=0;i<k;i++)
bellman(c[i],d[i]);
int s,nrsub=1<<k;
for (s=1;s<nrsub;s++)
{
for (i=0;i<k;i++)
if (s==(1<<i))
{
cost[i][s]=dd[c[i]];
break;
}
if (i<k) continue;
for (i=0;i<k;i++)
{
cost[i][s]=1<<29;
for (j=0;j<k;j++)
if(s&(1<<j) && j!=i)
cost[i][s]=min(cost[j][s-(1<<i)]+d[j][c[i]],cost[i][s]);// ??
}
}
int Min=1<<29;
for (i=0;i<k;i++)
Min=min(Min,cost[i][nrsub-1]+d[i][n]);
g<<Min;
}