复习QwQ……
题目:最小生成树
思想:不停地加入权值最小且不予其它边构成环的边。
代码:
#include<bits/stdc++.h>
using namespace std;
#define maxn 5000
#define maxm 200000
struct Edge{
int x,y,z;
Edge(int xx=0,int yy=0,int zz=0){
x=xx,y=yy,z=zz;
}
bool operator < (const Edge& oth) const {
return z<oth.z||(z==oth.z&&(x<oth.x||(x==oth.x&&y<oth.y)));
}
};
int n,m;
Edge a[maxm+5];
int fa[maxm+5];
void init(){
for(int i=1;i<=maxm;i++) fa[i]=i;
}
void readin(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
}
}
int find(int x){
return fa[x]==x?x:fa[x]=find(fa[x]);
}
int kruskal(){
int ans=0,cnt=0;
for(int i=1;i<=m;i++){
int fa1=find(a[i].x),fa2=find(a[i].y);
if(fa1==fa2) continue;
fa[fa1]=fa2;
ans+=a[i].z;
cnt++;
if(cnt==n-1) break;
}
if(cnt<n-1) return -1;
return ans;
}
int main() {
init();
readin();
sort(a+1,a+m+1);
int ans=kruskal();
if(ans==-1) printf("orz");
else printf("%d",ans);
return 0;
}