这是一个基本的克鲁斯卡尔代码,我贴在这里,为了以后更好的学习
代码如下:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 1001;
int pre[maxn];
struct Edge{
int u,v;
int cost;
};
bool operator < (const Edge &a,const Edge &b){
return a.cost<b.cost;
}
vector<Edge>edges;
void add(int a,int b,int v){
Edge e;
e.u=a;
e.v=b;
e.cost=v;
edges.push_back(e);
}
int find(int a){
return a==pre[a]?a:pre[a]=find(pre[a]);
}
void merge(int a,int b){
int fa=find(a);
int fb=find(b);
if(fa!=fb)
pre[fa]=fb;
}
int Kruskal(int n){
int res=0,count=0;
sort(edges.begin(),edges.end());
for(int i=0;i<edges.size();i++){
Edge e=edges[i];
if(find(e.u)==find(e.v))continue;
merge(e.u,e.v);
res+=e.cost;
count++;
}
if(count!=n-1)return -1;
return res;
}
int main(){
int n,m;
while(cin>>n>>m){
edges.clear();
for(int i=1;i<=m;i++){
pre[i]=i;
int a,b,v;
cin>>a>>b>>v;
add(a,b,v);
}
int res=Kruskal(n);
if(res==-1)cout<<"no"<<endl;
else cout<<"yes"<<endl;
}
return 0;
}