Cod sursa(job #667326)

Utilizator BarracudaFMI-Alex Dobrin Barracuda Data 22 ianuarie 2012 21:20:17
Problema Drumuri minime Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include<fstream>
#include<vector>
#include<math.h>
#define NMAX 1502
#define inf 40000000
#define eps 1e-10
using namespace std;
int n,m,i,j,a,b,nr[NMAX],H[NMAX],N,poz[NMAX],nod;
ifstream f("dmin.in");
ofstream g("dmin.out");
vector< pair <int,double> >G[NMAX];
double D[NMAX],minu,d1,d2,lg;
inline double comp ( double j ){
	if ( j < 0 )
		return -j;
	return j;
}
int rs(int k){
	return 2*k+1;
}
int ls(int k){
	return 2*k;
}
void sift(int k){
	int son=k;
	if(ls(k)<=N && D[H[ls(k)]] <D[H[son]])
		son=ls(k);
	if(rs(k)<=N && D[H[rs(k)]]  <D[H[son]])
		son=rs(k);
	if(son!=k)
		sift(son);
}
void percolate(int k){
	while(k>1 && D[H[k]]<D[H[k/2]]){
		swap(poz[H[k]],poz[H[k/2]]);
		swap(H[k],H[k/2]);
		k/=2;
	}
}
void insert(int x){
	H[++N]=x;
	poz[x]=N;
	percolate(poz[x]);
}
void getmin(){
	minu=H[1];
	swap(poz[H[1]],poz[H[N]]);
	swap(H[1],H[N]);
	--N;
	sift(poz[1]);
	poz[nod]=0;

}
void init(){
	for(i=1;i<=n;i++){
		if(i!=a)
			D[i]=inf;
	}
	D[a]=0;
}
void dijkstra(){
	insert(a);
	for(;N;){
		getmin();
		nod=minu;
		for(int i=0;i<G[nod].size();++i){
			d1=G[nod][i].second;
			if(comp( D[nod]+d1-D[G[nod][i].first]) <eps){
				nr[G[nod][i].first]+=nr[nod];
				if(nr[G[nod][i].first]>=104569)
					nr[G[nod][i].first]-=104569;
			}
			else{
				if(D[nod]+d1-D[G[nod][i].first]<eps){
					D[G[nod][i].first]=d1+D[nod];
					if(poz[G[nod][i].first])
						percolate(poz[G[nod][i].first]);
					else
						insert(G[nod][i].first);
					nr[G[nod][i].first]=nr[nod];
				}
			}
		}
	}
}
int main (){
	f>>n>>m;
	int w,e,r;
	for(i=1;i<=m;i++){
		f>>w>>e>>r;
		lg = log(r);
		G[w].push_back(make_pair(e,lg));
		G[e].push_back(make_pair(w,lg));
	}
	a=1;
	nr[a]=1;
	init();
	dijkstra();
	for(i=1;i<=n;i++){
		if(i!=a)
			g<<nr[i]<<" ";
	}
	return 0;
}