#include<iostream>
#include<map>
#include<vector>
using namespace std;
//最小生成树算法针对无向图;
vector<vector<int>> weight;
vector<int> F;
map<int,vector<pair<int,int>>> tag;
int father(int x){
return x==F[x]?x:F[x]=father(F[x]);
}
int main(){
cout<<"请输入边的数量:";
int N;
cin>>N;
weight.resize(N+1,vector<int>(N+1));
F.resize(N+1);//并查集;
for(int i=1;i<=N;i++) F[i]=i;//并查集的初始化;
cout<<"请输入边的数量:";
int k;
cin>>k;
for(int i=1;i<=k;i++){
cout<<"请输入起始节点:";
int a;
cin>>a;
cout<<"请输入终止结点:";
int b;
cin>>b;
cout<<"请输入权重:";
int weight1;
cin>>weight1;
weight[a][b]=weight1;
tag[weight1].push_back({a,b});//构建权重对应边的关系;
}
int n=0;
for(auto it1:tag){
if(n==N-1) break;//已经选中了N-1条边;
for(auto it:it1.second){
int x1=it.second.first;
int x2=it.second.second;
if(father(x1)==father(x2)){//使用并查集来判断两个结点是不是在一棵树上;
continue;
}
else{
F[father(x2)]=father(x1);
cout<<"边的起始节点:"<<x1<<" ";
cout<<"边的终点:"<<x2<<" ";
cout<<"边的权重:"<<weight[x1][x2]<<endl;
n++;//选中的边的数量加1;
}
}
}
return 0;
}
使用的是克鲁斯卡尔算法,写法有点幼稚,见谅。。。(毕竟明天考试,写的比较赶)