Pagini recente » Cod sursa (job #2212268) | Cod sursa (job #1291498) | Cod sursa (job #252144) | Cod sursa (job #387780) | Cod sursa (job #2935546)
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <queue>
#include <stack>
#define MAXK 17
#define MAXN 2003
using namespace std;
struct XYC{
int x,y,c;
};
struct XC{
int node,cost;
};
vector <XC> graf[MAXN];
vector <XC> arbo[MAXN];
queue <int> q;
int dina[MAXK][1<<MAXK];
int dist[MAXN];
int prit[MAXK];
int n,mi,k;
void AddEdge(XYC a){
graf[a.x].push_back({a.y,a.c});
graf[a.y].push_back({a.x,a.c});
}
void DFS(int mask){
int node;
for(node=0;node<k;node++){
if(dina[node][mask]!=0){
for(XC neigh : arbo[node]){
if((mask&(1<<neigh.node))==0){
if(dina[node][mask]+neigh.cost<dina[neigh.node][mask+(1<<neigh.node)] || dina[neigh.node][mask+(1<<neigh.node)]==0){
dina[neigh.node][mask+(1<<neigh.node)]=dina[node][mask]+neigh.cost;
}
}
}
}
}
}
void BFS(int poz){
int i,node;
node=prit[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(XC neigh : graf[node]){
if(dist[neigh.node]==-1 || dist[neigh.node]>dist[node]+neigh.cost){
dist[neigh.node]=dist[node]+neigh.cost;
q.push(neigh.node);
}
}
}
for(i=0;i<k;i++){
if(prit[poz]!=prit[i]){
arbo[poz].push_back({i,dist[prit[i]]});
}
}
}
int main(){
int m,i;
XYC a;
FILE *fin,*fout;
fin=fopen("ubuntzei.in","r");
fout=fopen("ubuntzei.out","w");
fscanf(fin,"%d%d%d",&n,&m,&k);
prit[0]=0;
prit[k+1]=n-1;
for(i=1;i<=k;i++){
fscanf(fin,"%d",&prit[i]);
prit[i]--;
}
k+=2;
for(i=0;i<m;i++){
fscanf(fin,"%d%d%d",&a.x,&a.y,&a.c);
a.x--;
a.y--;
AddEdge(a);
}
for(i=0;i<k;i++){
BFS(i);
}
dina[0][1]=1;
for(i=1;i<(1<<k);i++){
DFS(i);
}
mi=dina[k-1][(1<<k)-1]-1;
if(mi==-1){
fprintf(fout,"Nu exista solutie");
}else{
fprintf(fout,"%d",mi);
}
fclose(fin);
fclose(fout);
return 0;
}