Pagini recente » Cod sursa (job #1535572) | Cod sursa (job #417727) | Cod sursa (job #3251517) | Cod sursa (job #2607373) | Cod sursa (job #1005788)
#include<fstream>
#include<vector>
#define Eq(a,b) for(int q=0;q<=N;q++)(a)[q]=(b)[q]
using namespace std;
ifstream in("ubuntzei.in");
ofstream out("ubuntzei.out");
const int Nmax = 2005;
const int Mmax = 10005;
const int INF = 1<<30;
int N,M,K;
struct path{
int dest,cost;
};
vector<path> G[Nmax];
struct heap_item{
int val,xx,U[Nmax];
} H[Nmax+Mmax]; int L;
int D[Nmax],Ub[Nmax];
void swap(int a,int b){
heap_item aux;
aux=H[a];
H[a]=H[b];
H[b]=aux;
}
bool compare(int a, int b){
return ( H[a].val > H[b].val || H[a].U[0] > H[b].U[0]);
}
void upheap(int i){
if( i/2>0 && compare(i/2,i) ){
swap(i/2,i);
upheap(i/2);
}
}
void downheap(int i){
if( 2*i+1<=L && compare(i,2*i+1) ){
swap(2*i+1,i);
downheap(2*i+1);
}
else if( 2*i<=L && compare(i,2*i) ){
swap(2*i,i);
downheap(2*i);
}
}
heap_item First(){
heap_item R=H[1];
swap(1,L);
L--;
downheap(1);
return R;
}
void Push(heap_item x){
H[++L]=x;
upheap(L);
}
int main(){
int i,x,y,c;
int u0[Nmax];
in>>N>>M>>K;
u0[0]=N; for(i=1;i<=N;i++) u0[i]=1;
for(i=1;i<=K;i++){ in>>x; u0[x]=0; u0[0]--; }
for(i=1;i<=M;i++){
in>>x>>y>>c;
path w;
w.cost=c;
w.dest=y;
G[x].push_back(w);
w.dest=x;
G[y].push_back(w);
}
D[1]=0;
for(i=2;i<=N;i++) D[i]=INF;
heap_item start;
start.val=0;
start.xx=1;
Eq(start.U,u0);
Push(start);
while(L){
heap_item p=First();
//p.val
//p.xx
//p.U[]
for(vector<path>::iterator it=G[p.xx].begin();it!=G[p.xx].end();++it){
//it->dest
//it->cost
if( !p.U[it->dest] || Ub[it->dest] < (p.U[0] + (!p.U[it->dest])) || p.val+it->cost < D[it->dest]){
D[it->dest]=p.val+it->cost;
heap_item pp;
pp.val=D[it->dest];
pp.xx=it->dest;
Eq(pp.U,p.U);
if(!pp.U[it->dest]){
pp.U[it->dest]=1;
pp.U[0]++;
}
Ub[it->dest]=pp.U[0];
Push(pp);
}
}
}
out<<D[N];
return 0;
}