Cod sursa(job #1335926)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 6 februarie 2015 05:19:46
Problema Ubuntzei Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.93 kb
#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;
}