Pagini recente » Cod sursa (job #484196) | Cod sursa (job #2856759) | Cod sursa (job #1455984) | Cod sursa (job #2036686) | Cod sursa (job #1112892)
#include <fstream>
#include <vector>
#include <bitset>
#include <utility>
#include <queue>
using namespace std;
vector<pair<int,int> > graf[2005];
int graf2[20][20];
int n,k;
int spec[20];
int dist[20][2005];
bitset<2005> viz;
struct elem
{
int val;
};
elem make_elem(int x)
{
elem aux;
aux.val=x;
return aux;
}
#define me make_elem
int unde;
bool operator<(const elem &a,const elem &b)
{
if(dist[unde][a.val]>dist[unde][b.val])
return 1;
return 0;
}
priority_queue<elem> coada;
#define inf 400000005 //de mod
inline void dijkstra()
{
//cout<<"facem dijkstra de "<<unde<<' '<<spec[unde]<<endl;
int i,nod=spec[unde];
// cout<<"nod e sus "<<endl;
for(i=1;i<=n;i++)
viz[i]=0,dist[unde][i]=inf;
//cout<<"init viz cu 0 si dist["<<unde<<"]["<<i<<"]="<<inf<<endl;
dist[unde][nod]=0;
//cout<<"si pana la nod="<<nod<<" e bine "<<endl;
coada.push(me(nod));
//cout<<endl;
int y;
vector<pair<int,int> >::iterator it;
while(!coada.empty())
{
y=coada.top().val;
coada.pop();
if(!viz[y])
{
// cout<<"s-a scos porcaria de y="<<y<<endl;
viz[y]=1;
for(it=graf[y].begin();it!=graf[y].end();it++)
{
//cout<<"se analizeaza muchia cu "<<it->first<<endl;
if(dist[unde][y]+it->second<dist[unde][it->first])
{
dist[unde][it->first]=dist[unde][y]+it->second;
coada.push(me(it->first));
}
}
}
}
}
inline void build_dist()
{
int i;
for(i=0;i<=k;i++)
{
unde=i;
dijkstra();
}
}
int din[20][65540];
int main()
{
ifstream cin("ubuntzei.in");
ofstream cout("ubuntzei.out");
int m=0,i,a,b,c;
cin>>n>>m;
cin>>k;
spec[0]=1;
for(i=1;i<=k;i++)
cin>>spec[i];
for(i=1;i<=m;i++)
{
cin>>a>>b>>c;
graf[a].push_back(make_pair(b,c));
graf[b].push_back(make_pair(a,c));
}
build_dist();
int j;
/*cout<<"de aici"<<endl;
for(i=0;i<=k;i++)
{
cout<<"acum il facem pe "<<spec[i]<<endl;
for(j=1;j<=n;j++)
{
cout<<dist[i][j]<<' ';
}
cout<<endl;
}
cout<<"pana aici"<<endl;
*/
for(j=1;j<=k;j++)
din[j][1]=inf;
din[0][1]=0;
//cout<<"de aici"<<endl;
for(i=0;i<=k;i++)
{
for(j=0;j<=k;j++)
{
graf2[i][j]=dist[i][spec[j]];
// cout<<graf2[i][j]<<' ';
}
// cout<<endl;
}
//cout<<"asadar\n";
int l;
for(i=2;i<(1<<(k+1));i++)
{
//cout<<"lucam la starea i="<<i<<endl;
for(j=0;j<=k;j++)
{
din[j][i]=inf;
if(i&(1<<j))
if(i&(i-1))
{
for(l=0;l<=k;l++)
{
if(i&(1<<l))
{
din[j][i]=min(din[j][i],din[l][i-(1<<j)]+graf2[j][l]);
}
}
}
//cout<<"din["<<j<<"]["<<i<<"]="<<din[j][i]<<endl;
}
}
int minim=inf,aux;
for(i=0;i<=k;i++)
{
//cout<<"din["<<i<<"]="<<din[i][(1<<(k+1))-1]<<endl;
aux=din[i][(1<<(k+1))-1]+dist[i][n];
//cout<<aux<<endl;
if(aux<minim)
minim=aux;
}
cout<<minim<<'\n';
cin.close();
cout.close();
return 0;
}
/*
6 5
2 3 5
1 2 1
2 3 2
1 4 2
4 5 4
4 6 3
7 6
1 5
1 2 2
1 4 1
4 3 3
2 3 1
3 6 1000
3 7 4
//
5 4
1 4
1 2 1
2 3 1000
2 5 3
2 4 2
*/