Cod sursa(job #891663)

Utilizator Alexxino7Alexandru Popescu Alexxino7 Data 25 februarie 2013 18:49:32
Problema Ubuntzei Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.52 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <utility>
#include <algorithm>
using namespace std;
#define NMax 2002
#define INF 1<<30
#define pb push_back
#define ff first
#define ss second
typedef unsigned int uint;

ifstream fin("ubuntzei.in");
ofstream fout("ubuntzei.out");

int N,M,K,DK[20][20];
vector <int> MustVisit;
vector <pair<int,int> > G[NMax];
int H[NMax],Sel[NMax],Val[NMax],A[NMax]; // Dijkstra


void citire(){

    int x,y,c;
    fin>>N>>M>>K;
    MustVisit.pb(0);
    MustVisit.pb(1);
    for(int i=1;i<=K;i++) fin>>x,MustVisit.pb(x);
    MustVisit.pb(N);
    for(int i=1;i<=M;i++){
        fin>>x>>y>>c;
        G[x].pb(make_pair(y,c));
        G[y].pb(make_pair(x,c));
    }

}

inline int left_son(int x){ return 2*x; }
inline int right_son(int x){ return 2*x+1; }
inline int father(int x){ return x/2; }

void move_down(int x, int &LG){

    int best;
    while(left_son(x)<=LG){
        best=x;
        if(Val[H[left_son(x)]]< Val[H[x]])  best=left_son(x);
        if(right_son(x)<=LG && Val[H[right_son(x)]]<Val[H[best]]) best=right_son(x);

        if(best!=x){
            swap(H[x],H[best]);
            A[H[x]]=x;
            A[H[best]]=best;
            x=best;
        }
        else break;
    }

}

void eliminate(int x, int &LG){

    H[x]=H[LG];
    A[H[x]]=x;
    LG--;
    move_down(x,LG);

}

void move_up(int x){
    while(father(x)>0 && Val[H[x]]<Val[H[father(x)]]){
        swap(H[x],H[father(x)]);
        A[H[x]]=x;
        A[H[father(x)]]=father(x);
        x/=2;
    }
}

void dijkstra(int x,int L){

    int LG=N,Vf;

    for(int i=1;i<=N;i++) Val[i]=INF,H[i]=i,A[i]=i;
    Val[x]=0;
    eliminate(x,LG);
    for(uint i=0;i<G[x].size();i++){
        Val[G[x][i].ff]=G[x][i].ss;
        move_up(A[G[x][i].ff]);
    }

    while(LG){
        Vf=H[1];
        eliminate(1,LG);
        for(uint i=0;i<G[Vf].size();i++){
            if( Val[Vf]+G[Vf][i].ss < Val[G[Vf][i].ff]){
                Val[G[Vf][i].ff] = Val[Vf]+G[Vf][i].ss;
                move_up(G[Vf][i].ff);
            }
        }
    }

    for(uint i=1;i<MustVisit.size();i++){
        if(x!=MustVisit[i])
            DK[L][i]=Val[MustVisit[i]];
    }

}

int main(){

    citire();
    for(uint i=1;i<MustVisit.size();i++) dijkstra(MustVisit[i],i);
    /*for(int i=1;i<=K+2;i++){
        for(int j=1;j<=K+2;j++){
            fout<<DK[i][j]<<" ";
        }
        fout<<"\n";
    }*/
    fout<<DK[1][K+2]<<"\n";


    return 0;
}