Pagini recente » Cod sursa (job #622719) | Cod sursa (job #1125917) | Cod sursa (job #1234464) | Cod sursa (job #1441671) | Cod sursa (job #2156525)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
const int N=2005;
const int oo=200000000;
vector <pair <int,int> > a[N];
int n,m,k,dp[18][18],d[N],poz[N],l[16],nh,Dp[1<<18][18];
struct heap
{
int dist,nod;
};
heap h[N];
void citire()
{
int x,y,z,i;
in>>n>>m;
in>>k;
for(i=1; i<=k; i++)
in>>l[i];
l[0]=1;
l[k+1]=n;
//sort(l+1,l+k+1);
for(i=1; i<=m; i++)
{
in>>x>>y>>z;
a[x].push_back(make_pair(y,z));
a[y].push_back(make_pair(x,z));
}
}
void swapp(int i,int j)
{
swap(h[i],h[j]);
poz[h[i].nod]=i;
poz[h[j].nod]=j;
}
void urca(int nod)
{
while(nod>1 && h[nod].dist < h[nod/2].dist)
{
swapp(nod,nod/2);
nod=nod/2;
}
}
void coboara(int nod)
{
int fs=2*nod,fd=2*nod+1,bun=nod;
if(fs<=nh && h[fs].dist < h[bun].dist)
bun=fs;
if(fd<=nh && h[fd].dist < h[bun].dist)
bun=fd;
if(bun!=nod)
{
swapp(nod,bun);
coboara(bun);
}
}
void sterge(int nod)
{
swapp(nod,nh);
nh--;
coboara(nod);
}
void dijkstra(int nr)
{
int i;
nh=n;
for(i=1; i<=n; i++)
if(i!=nr)
{
h[i].dist=oo;
h[i].nod=i;
}
for(i=1; i<=n; i++)
dp[nr][i]=d[i];
h[nr].nod=nr;
h[nr].dist=0;
urca(nr);
for(i=1; i<=n; i++)
poz[i]=i;
for(i=1; i<=n; i++)
if(i!=nr)
d[i]=oo;
d[nr]=0;
while(nh > 0)
{
int nod=h[1].nod;
sterge(1);
for(i=0; i<a[nod].size(); i++)
{
int vecin=a[nod][i].first,cost=a[nod][i].second;
if(d[vecin]>d[nod]+cost)
{
d[vecin]=d[nod]+cost;
h[poz[vecin]].dist=d[vecin];
h[poz[vecin]].nod=vecin;
urca(poz[vecin]);
}
}
}
for(i=1; i<=n; i++)
if(d[i]==oo)
d[i]=0;
}
void ciclu()
{
int q,i,j;
if(k==0)
{
out<<dp[0][k+1]<<" ";
return;
}
k++;
for(i=1; i<=(1<<k); i++)
for(j=0; j<k; j++)
Dp[i][j]=oo;
Dp[1][0]=0;
for(i=1; i<(1<<k); i=i+2)
for(j=0; j<=k; j++)
if(((1<<j)& i) !=0 )
{
for(q=0; q<=k; q++)
{
if(((1<<q) & i) != 0)
Dp[i][j]=min(Dp[i][j],Dp[i^(1<<j)][q]+dp[q][j]);
}
}
else
Dp[i][j]=oo;
}
int main()
{
int i,j;
citire();
for(i=0; i<=k+1; i++)
for(j=0; j<=k+1; j++)
dp[i][j]=oo;
for(i=0; i<=k+1; i++)
{
dijkstra(l[i]);
for(j=0; j<=k+1; j++)
dp[i][j]=d[l[j]];
}
/* for(i=0; i<=k+1; i++)
{
for(j=0; j<=k+1; j++)
out<<dp[i][j]<<" ";
out<<endl;
}
*/
ciclu();
/* for(i=0; i<=(1<<k); i++)
{
for(j=0; j<=n; j++)
out<<Dp[i][j]<<" ";
out<<endl;
}
*/
int rez=oo;
for(i=0; i<=k; i++)
{
rez=min(rez,Dp[(1<<k)-1][i]+dp[i][k]);
}
out<<rez;
return 0;
}