dijkstra80分求改
查看原帖
dijkstra80分求改
445650
I_never_left楼主2023/6/10 12:54
#include <queue>
#include <cstring>
#include <cstdio>
#include <iostream>
#include <algorithm>

using namespace std;

#define x make_pair
const int N = 1010, M = 100010;

int n, m, s, ans;
int dis1[N], dis2[N];
int u[N], v[N], w[N];
int h[M], e[M], t[M], c[M], cnt;
bool vis[N];

void add(int a, int b, int d) {
	e[++ cnt] = h[a], c[cnt] = d, t[cnt] = b, h[a] = cnt;
}

void dijkstra(int s) {
	memset(vis, 0, sizeof(vis));
	
	priority_queue<pair<int, int> > q;
	q.push(x(0, s));
	
	dis1[s] = 0;
	
	while(q.size()) {
		int u = q.top().second;
		q.pop();
		
		if(vis[u]) continue;
		vis[u] = 1;
		
		for(int i = h[u]; i ; i = e[i]) {
			int v = t[i];
			if(dis1[v] > dis1[u] + c[i]) {
				dis1[v] = dis1[u] + c[i];
				q.push(x(-dis1[v], v));
			}
		}
	}
}

int main() {
	cin >> n >> m >> s;
	
	for(int i = 1; i <= n; ++ i)
		dis1[i] = 0x3f3f3f3f;
	for(int i = 1; i <= m; ++ i) {
		cin >> u[i] >> v[i] >> w[i];
		add(u[i], v[i], w[i]);
	}
	
	dijkstra(s);
	memset(h, 0, sizeof(h));
	for(int i = 1; i <= n; ++ i) {
		dis2[i] = dis1[i];
		dis1[i] = 0x3f3f3f3f;
	}
	
	cnt = 0;
	for(int i = 1; i <= m; ++ i)
		add(v[i], u[i], w[i]);

	dijkstra(s);
	
	for(int i = 1; i <= n; ++ i) {
		ans = max(ans, dis1[i] + dis2[i]);
	}
	cout << ans;
	return 0;
}
2023/6/10 12:54
加载中...