Pagini recente » Istoria paginii runda/miada | Cod sursa (job #2628969) | Cod sursa (job #1004380) | Cod sursa (job #1473220) | Cod sursa (job #803259)
Cod sursa(job #803259)
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>
#define mp make_pair
#define pb push_back
#define f first
#define s second
using namespace std;
int vk[20];
int dist[20][20];
int dist2[2005],dp[(1<<15)+13][20]; // stare | ultimul oras vizitat din stare
int isk[2005];
int n,m,k,x,y,cost;
vector<pair<int,int> > list[2005];
queue<int> q;
void bfs(int nodd)
{
q.push(nodd);
memset(dist2,127,sizeof(dist2));
dist2[nodd]=0;
while(q.size())
{
int nod=q.front();
q.pop();
for(int i=0;i<list[nod].size();i++)
{
int next_nod=list[nod][i].f;
int cost=list[nod][i].s;
if(dist2[next_nod]>dist2[nod]+cost)
{
dist2[next_nod]=dist2[nod]+cost;
if(isk[next_nod])
dist[isk[nodd]][isk[next_nod]]=dist2[next_nod];
q.push(next_nod);
}
}
}
}
void din()
{
for(int i=1;i<=k-2;i++)
dp[(1<<(i-1))][i]=dist[k-1][i];
for(int i=1;i<(1<<(k-2));i++)
{
for(int j=1;j<=k-2;j++)
{
if( ((1<<(j-1))&i)==0 )
{
dp[(i|(1<<(j-1)))][j]=1<<30;
for(int p=1;p<=k-2;p++)
{
if((1<<(p-1)&i))
{
dp[(i|(1<<(j-1)))][j]=min( dp[(i|(1<<(j-1)))][j],dp[i][p]+dist[j][p]);
}
}
}
}
}
}
int main()
{
ifstream f("ubuntzei.in");
ofstream g("ubuntzei.out");
f>>n>>m>>k;
for(int i=1;i<=k;i++)
{
f>>vk[i];
isk[vk[i]]=i;
}
k+=2;
vk[k-1]=1;
vk[k]=n;
isk[vk[k-1]]=k-1;
isk[vk[k]]=k;
for(int i=1;i<=m;i++)
{
f>>x>>y>>cost;
list[x].pb(mp(y,cost));
list[y].pb(mp(x,cost));
}
for(int i=1;i<=k;i++)
{
bfs(vk[i]);
}
/*for(int i=1;i<=k-2;i++)
for(int j=1;j<=k-2;j++)
cout<<" distanta intre "<<vk[i]<<" si "<<vk[j]<<" este : "<<dist[i][j]<<endl;*/
din();
int minim=1<<30;
if(k==0)
{
g<<dist[1][2];
return 0;
}
for(int i=1;i<=k-2;i++)
minim=min(minim,dp[(1<<(k-2))-1][i]+dist[i][k]);
g<<minim;
return 0;
}