Pagini recente » Cod sursa (job #2647270) | Cod sursa (job #1691082) | Cod sursa (job #347285) | Cod sursa (job #800300) | Cod sursa (job #671304)
Cod sursa(job #671304)
#include <fstream>
#include <utility>
#include <queue>
#include <algorithm>
#include <vector>
using namespace std;
vector<pair<int,int> >v[2005];
queue<int> Q;
queue< pair<int,int> >C;
bool inc[20][150000],inq[2005];
int d[2005],D[20][150000],n,m,k,c[20],a[20][20],put[20];
void puteri()
{
int p=1;
for(int i=1;i<=19;i++)
{
put[i-1]=p;
p*=2;
}
}
void bellman(int x)
{
for(int i=1;i<=n;i++) d[i]=int(2e9);
d[x]=0; Q.push(x); inq[x]=1;
while(!Q.empty())
{
x=Q.front();
inq[x]=0;
Q.pop();
for(int i=0;i<v[x].size();i++)
if(d[v[x][i].first]>d[x]+v[x][i].second)
{
d[v[x][i].first]=d[x]+v[x][i].second;
if(!inq[v[x][i].first])
{
inq[v[x][i].first]=1;
Q.push(v[x][i].first);
}
}
}
}
void bellman2(int x)
{
pair<int,int> nod;
for(int i=1;i<=k;i++)
for(int j=1;j<=150000;j++)
D[i][j]=int(2e9);
C.push(make_pair(x,1)); inc[x][1]=1;
D[x][1]=0;
while(!C.empty())
{
nod=C.front();
C.pop();
inc[nod.first][nod.second]=0;
for(int i=1;i<=k;i++)
if((!(nod.second&put[i-1])) and
(D[i][nod.second+put[i-1]]>a[nod.first][i]+D[nod.first][nod.second]))
{
D[i][nod.second+put[i-1]]=a[nod.first][i]+D[nod.first][nod.second];
if(!inc[i][nod.second+put[i-1]])
{
C.push(make_pair(i,nod.second+put[i-1]));
inc[i][nod.second+put[i-1]]=1;
}
}
}
}
int main()
{
int i,x,y,cost,j;
ifstream fi("ubuntzei.in");
ofstream fo("ubuntzei.out");
puteri();
fi>>n>>m>>k;
for(i=1;i<=k;i++)
fi>>c[i];
c[++k]=1; c[++k]=n;
swap(c[k-1],c[1]);
for(i=1;i<=m;i++)
{
fi>>x>>y>>cost;
v[x].push_back(make_pair(y,cost));
v[y].push_back(make_pair(x,cost));
}
for(i=1;i<=k;i++)
{
bellman(c[i]);
for(j=1;j<=k;j++) if(i!=j) a[i][j]=d[c[j]];
}
bellman2(1);
fo<<D[k][put[k]-1]<<"\n";
return 0;
}