Cod sursa(job #3167887)

Utilizator andrei_marciucMarciuc Andrei andrei_marciuc Data 11 noiembrie 2023 11:16:55
Problema Drumuri minime Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.33 kb
#include <algorithm>
#include <fstream>
#include <vector>
#include <queue>
#include <cmath>

#define int long long

using namespace std;

ifstream cin("dmin.in");
ofstream cout("dmin.out"); 

const int INF = 1e9 + 999;
const int MOD = 104659;
const int MAX = 1502;
const double EPS = 1e-6;

struct Muchii {
	int nod;
	double cost;

	bool operator<(const Muchii& A) const {
		return cost > A.cost + EPS;
	}
};

priority_queue<Muchii> pq;
vector<Muchii> adj[MAX];
double dp[MAX];
int ans[MAX];
int n, m;

static inline void dj() {
	for(int i = 2; i <= n; i++)
		dp[i] = INF;

	ans[1] = 1;
	dp[1] = 1;
	pq.push({1, 0});
	int cur;
	double cost, C;
	while(!pq.empty()) {
		cur = pq.top().nod;
		cost = pq.top().cost;
		pq.pop();

		for(const Muchii &M : adj[cur]) {
			C = dp[cur] * M.cost;
			if(dp[M.nod] >= EPS + C) {
				ans[M.nod] = ans[cur];
				//cout << C << ' ' << dp[M.nod] * C << '\n';
				dp[M.nod] = C;
				pq.push({M.nod, dp[M.nod]});
			} else if(abs(dp[M.nod] - C) < EPS)
				ans[M.nod] = (ans[M.nod] + ans[cur]) % MOD;
		}
	}
}

signed	 main() 
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);

	cin >> n >> m;

	int x, y;
	int c;
	while(m--) {
		cin >> x >> y >> c;
		double C = log2((double)c) * 10;
		adj[x].push_back({y, C});
		adj[y].push_back({x, C});
	}

	dj();

	for(int i = 2; i <= n; i++)
		cout << ans[i] << ' ';
	cout << '\n';
	return 0;
}