测评地址: https://www.luogu.org/problemnew/show/P3366
通过时间: 2019.5.5
评测详情: https://www.luogu.org/recordnew/show/18789651
用时: 469ms / 内存: 5312KB
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxm 200001
#define maxn 5001
#define ll long long
struct node{
ll u,v,w;
}e[maxm],t;
ll i,j,n,m,f[maxn];
bool cmp(node x,node y){
return x.w<y.w;//从大到小排>,从小到大排<
}
int getf(int u){
if(f[u]==u) return u;
return f[u]=getf(f[u]);
}
int merge(int u,int v){//左靠
ll f1=getf(u),f2=getf(v);
if(f1!=f2){
f[f2]=f1;//左靠 f1
return 1;
}
return 0;
}
int main(){
ll cnt=0,u,v,w,sum=0;//cnt统计生成树中用的边数
cin>>n>>m;
for(i=1;i<=n;i++) f[i]=i;
for(i=1;i<=m;i++) cin>>e[i].u>>e[i].v>>e[i].w;
sort(e,e+m,cmp);
for(i=1;i<=m;i++)
{
u=e[i].u,v=e[i].v,w=e[i].w;
if(merge(u,v)) cnt++,sum+=w;
if(cnt==n-1) break;
}
if(sum==0) printf("orz");
printf("%lld\n",sum);
return 0;
}
sort可以使用快排:
评测详情: https://www.luogu.org/recordnew/show/18789134
用时: 214ms / 内存: 5416KB
时间省一半,内存差不多。
#include<cstdio>
using namespace std;
#define maxm 200001
#define maxn 5001
#define ll long long
struct node{
ll u,v,w;
}e[maxm],t;
ll n,m,f[maxn];
void quick_sort(ll left,ll right)//自小到大
{
ll i=left,j=right,mid=e[(i+j)/2].w;//mid
while(i<=j){
while(e[i].w<mid) i++;
while(mid<e[j].w) j--;
if(i<=j)
t=e[i],e[i]=e[j],e[j]=t,i++,j--;
}
if(left<j) quick_sort(left,j);
if(i<right) quick_sort(i,right);
}
int getf(int u){
if(f[u]==u) return u;
return f[u]=getf(f[u]);
}
int merge(int u,int v){//左靠
ll f1=getf(u),f2=getf(v);
if(f1!=f2){
f[f2]=f1;//左靠 f1
return 1;
}
return 0;
}
int main(){
ll i,cnt=0,u,v,w,sum=0;//cnt统计生成树中用的边数
scanf("%lld%lld",&n,&m);
for(i=1;i<=n;i++) f[i]=i;
for(i=1;i<=m;i++) scanf("%lld%lld%lld",&e[i].u,&e[i].v,&e[i].w);
quick_sort(1,m);
for(i=1;i<=m;i++)
{
u=e[i].u,v=e[i].v,w=e[i].w;
if(merge(u,v)) cnt++,sum+=w;
if(cnt==n-1) break;
}
if(sum==0) printf("orz");
printf("%lld\n",sum);
return 0;
}