Pagini recente » Cod sursa (job #1310674) | Cod sursa (job #1935131) | Cod sursa (job #1342482) | Cod sursa (job #892692) | Cod sursa (job #891663)
Cod sursa(job #891663)
#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;
}