社区讨论

九敏

B3602[图论与代数结构 202] 最短路问题_2参与者 3已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mhj3aqcr
此快照首次捕获于
2025/11/03 20:01
4 个月前
此快照最后确认于
2025/11/03 20:01
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int inf = 0x3f3f3f3f3f3f3f3;
const int N = 3e5 + 10;
int n, m, dis[N];
struct Point { int u, v, w; }a[N];
struct edge{int to, nxt, w;}e[N];

int h[N], cnt;
bool vis[N];
queue<int> q;

inline void add (int u, int v, int w){
	e[++cnt].to = v;
	e[cnt].w = w;
	e[cnt].nxt = h[u];
	h[u] = cnt;
	// e[++cnt] = {v, h[u], w}, h[u] = cnt;
}
inline void Dijkstra (int s){
	memset (dis, 0x3f, sizeof(dis));
	dis[s] = 0; vis[s] = 1;
	q.push (s);
	while (!q.empty()){
		int u = q.front (); q.pop();
		for (int i=h[u]; i; i=e[i].nxt){
			int v = e[i].to, w = e[i].w;
			if (dis[v] > dis[u] + w) dis[v] = dis[u] + w;
			if (!vis[v]){
				q.push(v); vis[v] = 1;
			}
		}
	}
}
signed main (){
	scanf ("%lld%lld", &n, &m);
	for (int i=1, u, v, w; i<=m; i++){
		scanf ("%lld%lld%lld", &u, &v, &w);
		add (u, v, w);
	}
	Dijkstra(1);
	for (int i=1; i<=n; i++){
		if (dis[i] == inf) printf ("-1 ");
		else printf ("%lld ", dis[i]); 
	}
    return 0;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...