Pagini recente » Cod sursa (job #549420) | Cod sursa (job #2521125) | Cod sursa (job #809120) | Cod sursa (job #1820274) | Cod sursa (job #2939497)
#include <iostream>
#include <stdio.h>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
#define MAX_K 17
#define MAX_N 2003
struct drum{
int b,c;
};
int n,mi,k;
int v[MAX_K],dist[MAX_N];
int dp[MAX_K][1<<MAX_K];
vector <drum> gr[MAX_N];
vector <drum> ar[MAX_N];
queue <int> q;
void AddEdge(int a,int b,int c){
gr[b].push_back({a,c});
gr[a].push_back({b,c});
}
void bfs(int poz){
int i,node;
node=v[poz];
for(i=0;i<n;i++){
dist[i]=-1;
}
dist[node]=0;
q.push(node);
while(!q.empty()){
node=q.front();
q.pop();
for(drum ne : gr[node]){
if(dist[ne.b]==-1 || dist[ne.b]>dist[node]+ne.c){
dist[ne.b]=dist[node]+ne.c;
q.push(ne.b);
}
}
}
for(i=0;i<k;i++){
if(v[poz]!=v[i]){
ar[poz].push_back({i,dist[v[i]]});
}
}
}
int main(){
FILE *fin,*fout;
int a,b,c,i,m,node;
fin=fopen("ubuntzei.in","r");
fout=fopen("ubuntzei.out","w");
fscanf(fin,"%d%d%d",&n,&m,&k);
v[0]=0;
for(i=1;i<=k;i++){
fscanf(fin,"%d",&v[i]);
v[i]--;
}
v[k+1]=n-1;
k+=2;
for(i=0;i<m;i++){
fscanf(fin,"%d%d%d",&a,&b,&c);
a--;
b--;
AddEdge(a,b,c);
}
for(i=0;i<k;i++){
bfs(i);
}
dp[0][1]=1;
for(i=1;i<(1<<k);i++){
for(node=0;node<k;node++){
if(dp[node][i]!=0){
for(drum ne : ar[node]){
if((i&(1<<ne.b))==0){
if(dp[node][i]+ne.c<dp[ne.b][i+(1<<ne.b)] || dp[ne.b][i+(1<<ne.b)]==0){
dp[ne.b][i+(1<<ne.b)]=dp[node][i]+ne.c;
}
}
}
}
}
}
mi=dp[k-1][(1<<k)-1];
if(mi==0){
fprintf(fout,"Nu exista solutie");
}else{
fprintf(fout,"%d",mi-1);
}
fclose(fin);
fclose(fout);
return 0;
}