Cod sursa(job #2175510)

Utilizator serban24Popovici Serban-Florin serban24 Data 16 martie 2018 17:33:54
Problema Drumuri minime Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <bits/stdc++.h>
#define NMAX 1505
#define MOD 104659
#define INF 0x3f3f3f3f
#define cst first
#define nod second

using namespace std;

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

vector < pair<double,int> > mv[NMAX];
priority_queue < pair<double,int>, vector< pair<double,int> >, greater< pair<double,int> > > q;
double cost[NMAX];
int viz[NMAX];
int answer[NMAX];
double EPS=1e-10;

void dijkstra(int s){
	int i,x;

	cost[s]=0;
	answer[s]=1;
	q.push(make_pair(0.0,s));

	while(!q.empty()){
		x=q.top().nod;
		q.pop();

		if(viz[x])
			continue;

		viz[x]=1;

		for(i=0;i<mv[x].size();i++){
			if(cost[mv[x][i].nod]-(cost[x]+mv[x][i].cst)>=EPS){
				cost[mv[x][i].nod]=cost[x]+mv[x][i].cst;
				answer[mv[x][i].nod]=answer[x];
				q.push(make_pair(cost[mv[x][i].nod],mv[x][i].nod));
			}
			else if(abs(cost[mv[x][i].nod]-(cost[x]+mv[x][i].cst))<EPS){
				answer[mv[x][i].nod]+=answer[x];
				answer[mv[x][i].nod]%=MOD;
				q.push(make_pair(cost[mv[x][i].nod],mv[x][i].nod));
			}
		}
	}
}

int main(){
	int n,m,x,y,c,c1,i;

	fin>>n>>m;

	for(i=1;i<=n;i++)
		cost[i]=INF;

	for(i=1;i<=m;i++){
		fin>>x>>y>>c;

		c1=log2(1.0*c);

		mv[x].push_back(make_pair(c1,y));
		mv[y].push_back(make_pair(c1,x));
	}

	dijkstra(1);

	for(i=2;i<=n;i++)
		fout<<answer[i]<<" ";

    return 0;
}