Prim算法
dist[i]
距离设置为无穷大
dist[1]=0
for i in 0..n-1
- 找到不在
s
集合中,距离s
集合最近的点t
- 将这个点
t
放入集合中 - 利用这个点
t
, 更新不在集合中的点
Prim算法与Dijkstra算法的区别
Dijkstra算法是更新不在集合中的点 离起点
的距离
dist[j]=min(dist[j], dist[t]+g[t][j])
Prim是更新不在集合中的点 离集合S
的距离
dist[j] = min(dist[j], g[t][j])
#include<iostream>
#include<cstring>
using namespace std;
const int N = 510, INF = 0x3f3f3f3f;
int dist[N], g[N][N];
int n, m;
bool st[N];
int res = 0;
int prim() {
memset(dist, 0x3f, sizeof dist);
for (int i = 0; i < n; i++) {
int t = -1;
for (int j = 1; j <= n; j++) {
if (!st[j] && (t == -1 || dist[j] < dist[t])) {
t = j;
}
}
if (i && dist[t] == INF) return INF;//
st[t] = true;
if (i) res += dist[t];//
for (int j = 1; j <= n; j++) {
dist[j] = min(dist[j], g[t][j]);//
}
}
return res;
}
int main() {
memset(g, 0x3f, sizeof g);
cin >> n >> m;
//
for (int i = 0; i < m; i++) {
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
g[a][b] = g[b][a] = min(g[a][b], c);
}
int t = prim();
if (t == INF) puts("impossible");
else cout << t << endl;
}
大佬,我想问一下,先累加再更新该怎么理解呢?是不是 st[t]=true就相当于 直接去除负环这种情况?
累加操作和更新操作是互不影响的
st[t]=true
表示t节点属于s集合, s集合表示最小生成树集合, 更新的过程就是最小生成树产生的过程,前辈,main 最后return 0 不加不报错吗?
不会,但是最后是加上!!