TLE 求助
查看原帖
TLE 求助
1088058
ka_da_Duck楼主2024/5/2 12:11
// 最短路计数 luogu yc
#include <bits/stdc++.h>
#define int long long

using namespace std;
const int maxn = 5e3 + 10, inf = 0x7f7f7f7f, mod = 100003;

int n, m;
struct node {
	int v, w;
};
vector<node> e[maxn << 1];

struct edge{
	int to, dis;
	bool operator < (const edge &o) const{return dis > o.dis;}
};

int dis[maxn];
bool vis[maxn];

void dijkstra(int s) {
	memset(vis, 0, sizeof vis);
	memset(dis, 0x7f, sizeof dis);
	priority_queue<edge> q;
	q.push({s, 0});
	dis[s] = 0;
	while (!q.empty()) {
		int u = q.top().to;
		q.pop();
		if (vis[u]) continue;
		vis[u] = 1;
		for (auto ed: e[u]) {
			int v = ed.v, w = ed.w;
			if (dis[v] > dis[u] + w) {
				dis[v] = dis[u] + w;
				q.push({v, dis[v]});
			}
		}
	}
}

int ans;

void dfs(int u, int fa) {
	if (u == 2) {
		ans++;
		return;
	}
	for (auto ed: e[u]) if (ed.v != fa) {
		if (dis[ed.v] < dis[u]) dfs(ed.v, u);
	}
}

void init() {
	for (int i = 0; i < maxn; ++i) e[i].clear();
	ans = 0;
}

void solve() {
	init();
	for (int i = 1, u, v, w; i <= m; ++i) {
		cin >> u >> v >> w;
		e[u].push_back({v, w});
		e[v].push_back({u, w});
	}
	dijkstra(2);
	if (dis[2] == inf) {
		cout << 0 << '\n';
		return;
	}
	dfs(1, 0);
	cout << ans << '\n';
}

signed main() {
	ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
	while (cin >> n) {
		if (n == 0) exit(0);
		cin >> m;
		solve();
	}
}
2024/5/2 12:11
加载中...