最小生成树模板全输出 orz 求条
查看原帖
最小生成树模板全输出 orz 求条
1118614
I_Love_DS楼主2025/1/12 12:07
#include <bits/stdc++.h>

using namespace std;

const int N = 5050;

int n, m;

struct node {
	int to, w;
	node() {}
	node(int To, int W) {to = To, w = W;}
};

vector <node> e[N];
int dist[N];
set <pair <int, int>> q;
//bool b[N];

int prim() {
	memset(dist, 127, sizeof(dist));
	dist[1] = 0;
	q.clear();
	int ans = 0, tot = 0;
	for (int i = 1; i <= n; i++) q.insert({dist[i], i});
	while (!q.empty()) {
		int x = q.begin()->second;
		q.erase(q.begin());
		if (dist[x] > 1 << 30) break;
		ans += dist[x];
		++tot;
		//b[x] = 1;
		for (auto y : e[x]) 
			if (dist[y.to] > y.w) { // 			if (!b[y.to] && dist[y.to] > y.w) {
				q.erase({dist[y.to], y.to});
				dist[y.to] = y.w;
				q.insert({dist[y.to], y.to});
			}
	}
	if (tot != n) return -1;
	return ans;
}

int main() {
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= m; i++) {
		int u, v, w;
		scanf("%d%d%d", &u, &v, &w);
		e[u].push_back(node(v, w));
		e[v].push_back(node(u, w));
	}
	int ans = prim();
	if (ans == -1) printf("orz\n");
	else printf("%d\n", ans);
	return 0;
}

为什么 dijkstra 没有标记而 prim 需要标记呢??

2025/1/12 12:07
加载中...