Pagini recente » Cod sursa (job #1940295) | Monitorul de evaluare | Cod sursa (job #2180700) | Cod sursa (job #334737) | Cod sursa (job #1335926)
#include<cstdio>
#include<vector>
#include<queue>
#define INF 2000000000
using namespace std;
queue<int>q;
vector< pair<int,int> >L[2500];
int n,m,k,a,b,c,p,i,j,ii,vmin,v[2500],x[2500],y[2500],z[2500][2500],d[25][33000];
FILE *f,*g;
void bfs(int a){
for(int i=1;i<=n;i++){
x[i]=0;
y[i]=INF;
}
y[a]=0;
q.push(a);
while(!q.empty()){
b=q.front();
x[b]=0;
for(int i=0;i<L[b].size();i++){
if(y[ L[b][i].first ]>L[b][i].second+y[b]){
y[ L[b][i].first ]=L[b][i].second+y[b];
if(x[ L[b][i].first ]==0){
q.push(L[b][i].first);
x[ L[b][i].first]=1;
}
}
}
q.pop();
}
}
int minim(int a,int b){
if(a<b)
return a;
return b;
}
int main(){
f=fopen("ubuntzei.in","r");
g=fopen("ubuntzei.out","w");
fscanf(f,"%d%d%d",&n,&m,&k);
for(i=1;i<=k;i++){
fscanf(f,"%d",&v[i]);
}
v[++k]=n;
v[0]=1;
for(i=1;i<=m;i++){
fscanf(f,"%d%d%d",&a,&b,&c);
L[a].push_back(make_pair(b,c));
L[b].push_back(make_pair(a,c));
}
for(i=0;i<=k;i++){
bfs(v[i]);
for(j=0;j<=k;j++){
z[i][j]=y[ v[j] ];
}
}
m=(1<<(k-1));
for(i=0;i<=k;i++){
for(j=0;j<m;j++){
d[i][j]=INF;
}
}
d[0][0]=0;
for(i=0;i<m;i++){
for(j=0;j<k;j++){
if(d[j][i]!=INF){
for(ii=1;ii<k;ii++){
if( !i & ( 1<<(ii-1) ) ){
d[ii][ i | ( 1<<(ii-1) ) ] = minim( d[ii][ i | (1<<(ii-1) ) ], d[j][i]+z[j][ii] );
}
}
}
}
}
vmin=INF;
for(i=1;i<k;i++){
vmin=minim(vmin,d[i][m-1]+z[i][k]);
}
fprintf(g,"%d",vmin);
fclose(f);
fclose(g);
return 0;
}