Cod sursa(job #170303)

Utilizator scvalexAlexandru Scvortov scvalex Data 2 aprilie 2008 16:57:12
Problema Drumuri minime Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>

using namespace std;

typedef pair<int, double> pid;

#define MOD 104659

int N, M;
vector<pid> G[1501];

double dist[1501];
int cnt[1501];

int q[1501];
bool inq[1501];
int begq, endq;

void dijkstra() {
	for (int i(1); i <= N; ++i)
		dist[i] = 1 << 30;

	q[endq++] = 1;
	inq[1] = true;
	cnt[1] = 1;
	dist[1] = 0;

	while (begq != endq) {
		int u = q[begq];

		for (vector<pid>::iterator v = G[u].begin(); v != G[u].end(); ++v)
			if (dist[u] + v->second < dist[v->first]) {
				cnt[v->first] = cnt[u];
				dist[v->first] = dist[u] + v->second;
				if (!inq[v->first]) {
					inq[v->first] = true;
					q[endq] = v->first;
					endq = (endq + 1) % N;
				}
			} else if (dist[u] + v->second - dist[v->first] <= 0.0001) {
				cnt[v->first] = (cnt[v->first] + cnt[u]) % MOD;
			}

		begq = (begq + 1) % N;
		inq[u] = false;
	}
}

int main(int argc, char *argv[]) {
	FILE *fi = fopen("dmin.in", "r");
	fscanf(fi, "%d %d", &N, &M);
	int u, v, w;
	for (int i(0); i < M; ++i) {
		fscanf(fi, "%d %d %d", &u, &v, &w);
		G[u].push_back(make_pair(v, log(w)));
		G[v].push_back(make_pair(u, log(w)));
	}
	fclose(fi);

	dijkstra();

	FILE *fo = fopen("dmin.out", "w");
	for (int i(2); i <= N; ++i)
		fprintf(fo, "%d ", cnt[i]);
	fprintf(fo, "\n");
	fclose(fo);

	return 0;
}