Pagini recente » Cod sursa (job #2442208) | Cod sursa (job #1085297) | Cod sursa (job #2650235) | Cod sursa (job #2748686) | Cod sursa (job #899512)
Cod sursa(job #899512)
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream in("ubuntzei.in");
ofstream out ("ubuntzei.out");
struct cost
{
int vf,c;
};
const int N=2002,INF=200000000;
vector <cost> a[N];
queue <int> q;
int n,m,k,o[N],c[16][N],d[(1<<16)][N];
bool inq[N];
void bfs(int p)
{
int y,x;
q.push(p);
while(!q.empty())
{
x=q.front();
q.pop();
inq[x]=false;
for(size_t i=0;i<a[x].size();i++)
{
y=a[x][i].vf;
if(c[p][x]+a[x][i].c<c[p][y])
{
c[p][y]=c[p][x]+a[x][i].c;
if(!inq[y])
{
q.push(y);
inq[y]=true;
}
}
}
}
}
void citire()
{
int x,y,c;
cost aux;
in>>n>>m>>k;
for(int i=1;i<=k;i++)
in>>o[i];
for(int i=1;i<=m;i++)
{
in>>x>>y>>c;
aux.vf=y;
aux.c=c;
a[x].push_back(aux);
aux.vf=x;
a[y].push_back(aux);
}
}
void init()
{
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
c[i][j]=INF;
for(int i=0;i<(1<<k);i++)
for(int j=0;j<=n;j++)
d[i][j]=INF;
}
void init1()
{
for(int i=0;i<=N;i++)
inq[i]=0;
}
void hamilton()
{
int p;
for(int i=1;i<(1<<k);i+=2)
for(int j=0;j<=k;j++)
//if(i&(1<<(o[j]-1)))
for(size_t x=0;x<a[o[j]].size();x++)
{
p=a[o[j]][x].vf;
if(i&(1<<(p-1)))
if(d[i^(1<<(o[j]-1))][p] + c[o[j]][p] < d[i][o[j]])
d[i][o[j]]=d[i^(1<<(o[j]-1))][p] + c[o[j]][p];
}
}
void afisare()
{
for(int i=0;i<=k;i++)
{
for(int j=1;j<=n;j++)
out<<c[o[i]][j]<<' ';
out<<'\n';
}
out<<'\n';
for(int i=1;i<(1<<k);i+=2)
{
for(int j=0;j<=n;j++)
out<<d[i][j]<<' ';
out<<'\n';
}
}
int main()
{
citire();
init();
o[0]=1;
d[1][1]=0;
for(int i=0;i<=k;i++)
{
init1();
c[o[i]][o[i]]=0;
bfs(o[i]);
}
hamilton();
afisare();
int minim=INF;
for(size_t i=0;i<a[1].size();i++)
{
int j=a[1][i].vf;
if(d[(1<<k)-1][j] <minim)
minim = d[(1<<k)-1][j];
}
if(minim!=INF)
out<<minim+c[o[k]][n];
else out<<c[1][n];
return 0;
}