小技巧
  • 板块P1342 请柬
  • 楼主lly66666
  • 当前回复4
  • 已保存回复6
  • 发布时间2025/1/4 15:10
  • 上次更新2025/1/4 15:40:56
查看原帖
小技巧
1377891
lly66666楼主2025/1/4 15:10

可以进行反向建边+SPFA

记得开long long, 并跑两遍SPFA,代码极短(求关)

上代码:

#include <bits/stdc++.h>
using namespace std;
long long dis[1000005], n, m, ans, u[1000005], v[1000005], w[1000005];
bool vis[1000005];
vector<pair<int, int> > g[1000005];
void bfs(long long x) {
	memset(dis, 0x3f, sizeof(dis));
	memset(vis, false, sizeof(vis));
	queue<int> q;
	q.push(x);
	dis[x] = 0;
	vis[x] = true;
	while(q.size()) {
		int x = q.front();
		q.pop();
		vis[x] = false;
		for(int i = 0; i < g[x].size(); i ++) {
			long long v = g[x][i].first, w = g[x][i].second;
			if(dis[v] > dis[x] + w) {
				dis[v] = dis[x] + w;
				if(!vis[v]) {
					vis[v] = true;
					q.push(v);
				}
			}
		}
	}
}
int main() {
	cin >> n >> m;
	for(long long i = 1; i <= m; i ++) {
		cin >> u[i] >> v[i] >> w[i];
		g[u[i]].push_back({v[i], w[i]});
	}
	bfs(1);
	for(long long i = 1; i <= n; i ++) ans += dis[i], g[i].clear();
	for(long long i = 1; i <= m; i ++) g[v[i]].push_back({u[i], w[i]});
	bfs(1);
	for(long long i = 1; i <= n; i ++) ans += dis[i];
	cout << ans;
	return 0;
}
2025/1/4 15:10
加载中...