struct ArcNode
{
int data;
int i, j;
};
int cmp(const ArcNode &x, const ArcNode &y)//从小到大排序
{
return x.data < y.data;
}
sort(myArcNode,myArcNode+an, cmp);//排序
//数据初始化
int vn, an, w = 0;
int r;
cin >> vn >> an;
ArcNode *myArcNode = new ArcNode[an];
int *c = new int[vn];
int k,m;
int count = 0;
for (k = 0; k < an; k++)//输入边
{
cin >> myArcNode[k].i >> myArcNode[k].j;
cin >> myArcNode[k].data;
}
sort(myArcNode, myArcNode + an, cmp);//排序
for (k = 0; k < an; k++)//输出排序好的边
{
cout << myArcNode[k].i << " " << myArcNode[k].j << " ";
cout << " " << myArcNode[k].data << endl;
}
for (k = 0; k < vn; k++)//初始化编号数组
{
c[k] = k;
}
//构建最小生成树
for (k = 0; k < an ; k++)//循环an次 确保能找到vn-1条边构建最小生成树
{
if (c[myArcNode[k].i] != c[myArcNode[k].j])//不属于同一类
{
//保存j的值 因为j的值会被i替掉 但j之前的还没改变
r = c[myArcNode[k].j];
c[myArcNode[k].j] = c[myArcNode[k].i];
for (m = 0; m <= vn - 1; m++)
{
if (c[m] == r)//将之前的节点全部修改
{
c[m] = c[myArcNode[k].i];
}
}
w += myArcNode[k].data;
cout << "w=" << w << endl;//打印构建生成树的边
cout << myArcNode[k].i << "->";
cout << myArcNode[k].j << endl;
count++;
if (count == vn - 1)//已经找到了vn-1条边
{
cout << count << endl;
break;
}
}
}
//打印c[]
for (m = 0; m < vn; m++)
{
cout << c[m] << endl;
}
数据:
6 9
0 2 46
3 4 38
0 1 34
4 5 26
3 5 25
2 5 25
0 5 19
2 3 17
1 4 12