原来的代码:
#include <iostream>
#include <algorithm>
#define ll long long
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int maxn=2e3+1,maxm=3e3+1,inf=1e9+1;
struct node{
int be,to,nxt,w;
node():w(inf){}
friend bool operator<(const node a,const node b){return a.w<b.w;}
}e[maxm];
int n,m,u,v,w,tot,sum,fa[maxn],head[maxn];
ll ans;
void link(int x,int y,int z){
e[++tot].be=x;
e[tot].to=y;
e[tot].w=Min(e[tot].w,z);
e[tot].nxt=head[x];
head[x]=tot;
}
int Find(int x){
if(x==fa[x]) return x;
return fa[x]=Find(fa[x]);
}
void Union(int x,int y){
int fx=Find(x),fy=Find(y);
if(fx!=fy) fa[fx]=fy;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++) scanf("%d%d%d",&u,&v,&w),link(u,v,w);
sort(e+1,e+m+1);
for(int i=1;i<=m&&sum<n-1;i++)
if(Find(e[i].be)!=Find(e[i].to))
Union(e[i].be,e[i].to),sum++,ans+=e[i].w;
if(sum!=n-1) printf("orz");
else printf("%lld",ans);
return 0;
}
后来的代码:
#include <iostream>
#include <algorithm>
#define ll long long
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int maxn=5e3+1,maxm=2e5+1,inf=1e9+1;
struct node{
int be,to,nxt,w;
node():w(inf){}
friend bool operator<(const node a,const node b){return a.w<b.w;}
}e[maxm];
int n,m,u,v,w,tot,sum,fa[maxn],head[maxn];
ll ans;
void link(int x,int y,int z){
e[++tot].be=x;
e[tot].to=y;
e[tot].w=Min(e[tot].w,z);
e[tot].nxt=head[x];
head[x]=tot;
}
int Find(int x){
if(x==fa[x]) return x;
return fa[x]=Find(fa[x]);
}
void Union(int x,int y){
int fx=Find(x),fy=Find(y);
if(fx!=fy) fa[fx]=fy;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++) scanf("%d%d%d",&u,&v,&w),link(u,v,w);
sort(e+1,e+m+1);
for(int i=1;i<=m&&sum<n-1;i++)
if(Find(e[i].be)!=Find(e[i].to))
Union(e[i].be,e[i].to),sum++,ans+=e[i].w;
if(sum!=n-1) printf("orz");
else printf("%lld",ans);
return 0;
}