Pagini recente » Cod sursa (job #1125723) | Cod sursa (job #1227572) | Cod sursa (job #1671635) | Cod sursa (job #3260086) | Cod sursa (job #2453081)
#include <iostream>
#include <fstream>
#include <functional>
#include <vector>
#include <queue>
using namespace std;
ifstream intrare("ubuntzei.in");
ofstream iesire("ubuntzei.out");
const int NMAX=2005;
priority_queue < int, vector < int >, greater< int > >c;
vector < pair <int, int > >graf[NMAX];
int vizitat[NMAX],i,j,n,m,k;
int frd[NMAX];
int dp[1<<18][18];
int mindist[18][18];
const int inf=(1<<30);
int dist[NMAX];
void dijkstra(int x){
for(i=1;i<=n;i++){
vizitat[i]=false;
dist[i]=inf;
}
vizitat[x]=true;
dist[x]=0;
c.push(x);
while(!c.empty()){
int nod=c.top();
c.pop();
vizitat[nod]=false;
for(size_t i=0;i<graf[nod].size();i++){
int vecin=graf[nod][i].first;
int cost=graf[nod][i].second;
int costnou=dist[nod]+cost;
if(costnou<dist[vecin]){
dist[vecin]=costnou;
if(!vizitat[vecin]){
vizitat[vecin]=true;
c.push(vecin);
}
}
}
}
}
int main(){
intrare>>n>>m>>k;
for(i=1;i<=k;i++)
intrare>>frd[i];
for(i=1;i<=m;i++){
int a,b,c;
intrare>>a>>b>>c;
graf[a].push_back(make_pair(b,c));
graf[b].push_back(make_pair(a,c));
}
if(k!=0){
frd[0]=1;
frd[k+1]=n;
k+=2;
for(int i=0;i<k;i++){
dijkstra(frd[i]);
for(j=i+1;j<=k;j++)
if(i!=j)
{
mindist[frd[i]][frd[j]]=dist[frd[j]];
mindist[frd[j]][frd[i]]=dist[frd[j]];
}
}
for(i=0;i<(1<<k);i++)
for(j=0;j<k;j++)
dp[i][j]=inf;
dp[1][0]=0;
for(int masca=1;masca<(1<<k);masca+=2)
for(i=0;i<k;i++){
if(masca&(1<<i))
for(int z=0;z<k;z++)
if(i!=z && (masca&(1<<z))){
dp[masca][i]=min(dp[masca][i],dp[masca^(1<<i)][z]+mindist[frd[i]][frd[z]]);
}
}
iesire<<dp[(1<<k)-1][k-1];
}
else{
dijkstra(1);
iesire<<dist[n];
}
}