优质解答
//要用到并查集判断回路,代码先给你吧,看不懂追问
#include
#include
using namespace std;
#define MAXN 1005 //假设点数不超过1000
int n,m;
int fa[MAXN];
int id[MAXN];
struct Edge { //边的数据结构
int from, to;
int len;
};
Edge edge[MAXN * MAXN];
bool cmp(Edge a, Edge b) { //边的比较函数
return a.len
}
int find(int x) { //并查集,用于判断是否与已选择的边构成环
if (fa[x] == -1)
return x;
else
return fa[x] = find(fa[x]);
}
void Kruskal(int n) {
memset(fa, -1, sizeof(fa)); //初始化fa数组
int cnt = 0;
for (int i = 0; i
int u = edge[i].from;
int v = edge[i].to;
int t1 = find(u); //找第一个点的起始点
int t2 = find(v); //找第二个点的起始点
if (t1 != t2) { //如果不相等,则不构成回路
fa[t1] = t2;
id[cnt]=i;
cnt++;
if (cnt == n - 1) //当已选了n-1条边时,退出循环
break;
}
}
}
int main()
{
while(scanf("%d%d",&n,&m))
{
int a,b,c;
for(int i=0;i
{
scanf("%d%d%d",&a,&b,&c);
edge[i].from=min(a,b);
edge[i].to=max(a,b);
edge[i].len=c;
}
sort(edge,edge+m,cmp);
Kruskal(n);
for(int i=0;i
{
int t=id[i];
printf("%d %d %d\n",edge[t].from,edge[t].to,edge[t].len);
}
}
return 0;
}