Cod sursa(job #1005788)

Utilizator teoionescuIonescu Teodor teoionescu Data 5 octombrie 2013 20:02:50
Problema Ubuntzei Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.9 kb
#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;
}