还是畅通工程
模板题。
Prim算法代码:
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
int n;
int a, b, c;
int mp[105][105];
bool vis[105];
int dis[105];
int ans, now;
void Prim(){
for(int i = 1; i <= n; ++i){
dis[i] = INF;
vis[i] = false;
}
for(int i = 1; i <= n; ++i){
dis[i] = mp[1][i];
}
dis[1] = 0;
vis[1] = true;
for(int i = 1; i < n; ++i){
now = INF;
int min_1 = INF;
for(int j = 1; j <= n; ++j){
if(!vis[j]&&dis[j]<min_1){
now = j;
min_1 = dis[j];
}
}
vis[now] = true;
ans += min_1;
for(int j = 1; j <= n; ++j){
if(!vis[j]&&dis[j]>mp[now][j]){
dis[j] = mp[now][j];
}
}
}
printf("%d\n", ans);
}
int main(){
while(scanf("%d", &n)!=EOF){
if(n==0)break;
int m = n*(n-1)/2;
ans = 0;
memset(mp, 0x3f3f3f3f, sizeof(mp));
for(int i = 0; i < m; ++i){
scanf("%d %d %d", &a, &b, &c);
if(c<mp[a][b])mp[a][b] = mp[b][a] = c;
}
Prim();
}
return 0;
}
Kruskal算法代码:
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e2+5;
int n, m, ans;
int par[105];
struct EDGE{
int s, e, v;
bool operator <(const EDGE node){
return v<node.v;
}
}edge[MAXN*MAXN];
void Init(){
ans = 0;
for(int i = 1; i <= n; ++i){
par[i] = i;
}
}
int Find(int node){
if(par[node]==node){
return node;
}
return Find(par[node]);
//return par[node] = Find(par[node]);//路径合并
}
void Kruskal(){
Init();
for(int i = 1; i <= m; ++i){
int fx = Find(edge[i].s);
int fy = Find(edge[i].e);
if(fx!=fy){
if(fx>fy){
par[fx] = fy;
}
else{
par[fy] = fx;
}
ans += edge[i].v;
}
}
printf("%d\n", ans);
}
int main(){
while(scanf("%d", &n)!=EOF, n){
m = n*(n-1)/2;
for(int i = 1; i <= m; ++i){
scanf("%d %d %d", &edge[i].s, &edge[i].e, &edge[i].v);
}
sort(edge+1, edge+m+1);
Kruskal();
}
return 0;
}