输入:顶点编号及边权重。例:
0 1 10
0 2 151
1 2 50
输出:最小生成树。例:
0 1 10
0 2 15
源代码:
#include <iostream> #include <cstdio> #include <algorithm>
using namespace std;
struct Edge{ int x; int y; int w; };
const int MAXN = 100; int pa[MAXN]; int rank[MAXN];
int cmp(Edge a,Edge b){ return a.w < b.w; } //交换函数,按从小到大排序
void make_set(int x){ pa[x] = x; rank[x] = 1; } //初始化函数
int find_set(int x){ if(x != pa[x]) pa[x]=find_set(pa[x]); return pa[x]; }
bool union_set(int x,int y){ x = find_set(x); y = find_set(y); if(x == y) return false; if(rank[x] > rank[y]) { pa[y] = x; } else{ pa[x] = y; if(rank[x] == rank[y]) rank[y]++; } return true; } // 并查集
int main() { int n, ltotal; Edge edge[MAXN]; scanf("%d", &n); while(n--) { int v,l; scanf("%d%d", &v, &l); ltotal = 0; for(int i = 1;i <= v;i++) make_set(i); for(int i = 1; i <= l ; i++) { scanf("%d%d%d", &edge[i].x, &edge[i].y, &edge[i].w); } sort(edge + 1, edge + 1 + l, cmp); for(int i = 1; i <= l; i++) { if(union_set(edge[i].x, edge[i].y)) { ltotal++; printf("%d %d %d\n",edge[i].x,edge[i].y,edge[i].w); } if(ltotal == v - 1) { break; } } } return 0; } |