- 一般无向图
- 建图
- 稠密图-prim算法
- 稀疏图-kruskal算法
prim : 加点法
1.先随机选一个点,加入集合 ,之后寻找最短的距离的点加入集合,行程最小生成树。
2.注意最小生成树是不能有回路的, 所以可以把回路设置成最大值,即假装不存在。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>using namespace std;const int N = 510;
int n;
int g[N][N], dist[N]; bool vis[N];int res;bool prim(){memset(dist, 0x3f,sizeof dist);for(int i = 0; i < n; i++){int t = -1;for(int j = 1; j <= n; j++){if(!vis[j] && (t == -1 || dist[t] > dist[j])){t = j;}}vis[t] = true;if(i && dist[t] == 0x3f3f3f3f){return false;}if(i) res+= dist[t];for(int j = 1; j <= n; j++){dist[j] = min(dist[j], g[t][j]);}}return true;
}int main(){int m;cin>>n>>m;int u,v,w;memset(g, 0x3f, sizeof g);for(int i = 0; i < m; i++){cin>>u>>v>>w;if(u != v){g[u][v] = g[v][u] = min(g[u][v],w);}}bool ans = prim();if(ans){cout<<res<<'\n';}else cout<<"impossible" << '\n';return 0;
}