Pagini recente » Cod sursa (job #1727132) | Cod sursa (job #3158341) | Cod sursa (job #312473) | Cod sursa (job #1390575) | Cod sursa (job #2857905)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");
int n ,m;
int k, ubuntzei[20];
struct muchie
{
int nod_curent, nod_urm;
int cost;
};
vector <muchie> v[2005];
int dist[20][2005], dp[2005][35000];
int vizitat[2005];
const int MAAX=1e9;
struct elem_heap
{
int nod, cost;
bool operator <(const elem_heap & other)const
{
return cost>other.cost;
}
};
queue <elem_heap> heap;
void dijkstra(int x)
{
for(int i=1;i<=n;i++)
{
dist[x][i]=MAAX;
vizitat[i]=0;
}
elem_heap nou;
nou.cost=0;
nou.nod=ubuntzei[x];
dist[x][ubuntzei[x]]=0;
heap.push(nou);
while(heap.size())
{
elem_heap primul=heap.front();
heap.pop();
if(vizitat[primul.nod]==1)
{
continue;
}
vizitat[primul.nod]=1;
for(int i=0;i<v[primul.nod].size();i++)
{
muchie vecin=v[primul.nod][i];
if(dist[x][vecin.nod_urm]>dist[x][primul.nod]+vecin.cost)
{
dist[x][vecin.nod_urm]=dist[x][primul.nod]+vecin.cost;
elem_heap NEW;
NEW.cost=dist[x][vecin.nod_urm];
NEW.nod=vecin.nod_urm;
heap.push(NEW);
}
}
}
}
void hamilt()
{
for(int masc=1;masc<(1<<(k+2));masc+=2)
{
for(int i=1;i<=k+2;i++)
{
for(int j=1;j<=k+2;j++)
{
if(((1<<(j-1)) & masc)==0)
{
int masca=masc+(1<<(j-1));
dp[j][masca]=min(dp[j][masca],dp[i][masc]+dist[i][ubuntzei[j]]);
}
}
}
}
}
int main()
{
fin>>n>>m;
fin>>k;
for(int i=1;i<=k;i++)
{
fin>>ubuntzei[i];
}
for(int i=1;i<=m;i++)
{
int a, b, c;
fin>>a>>b>>c;
muchie nou;
nou.cost=c;
nou.nod_curent=a;
nou.nod_urm=b;
v[a].push_back(nou);
nou.nod_curent=b;
nou.nod_urm=a;
v[b].push_back(nou);
}
ubuntzei[k+1]=1;
ubuntzei[k+2]=n;
for(int i=1;i<=k+2;i++)
{
dijkstra(i);
}
for(int i=1;i<=k+2;i++)
{
for(int j=0;j<(1<<(k+2));j++)
{
dp[i][j]=MAAX;
}
}
dp[1][1]=0;
hamilt();
int minim=MAAX;
for(int i=1;i<=k+2;i++)
{
minim=min(minim,dp[i][(1<<(k+2))-1]);
//fout<<dp[i][(1<<(k+2))-1]<<' ';
}
//fout<<'\n';
fout<<minim;
return 0;
}