社区讨论
P2573 WA 0 求调
学术版参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @m5c66zb6
- 此快照首次捕获于
- 2024/12/31 15:51 去年
- 此快照最后确认于
- 2024/12/31 16:00 去年
CPP
#include<cstdio>
#include<algorithm>
using namespace std;
long long n,m;
long long hig[100005];
long long a,b;
struct s{
long long st,en,wh;
};
s arr[2000005];
long long num[2000005],pre[2000005],w[2000005],last[100005],cnt;
long long t[100005];
long long fa[100005];
long long ans;
void add(long long x,long long y,long long z){
++cnt;
num[cnt]=y;
pre[cnt]=last[x];
w[cnt]=z;
last[x]=cnt;
}
void dfs(long long xy){
ans++;
t[xy]=1;
for(long long i=last[xy];i;i=pre[i]){
if(t[num[i]]==0){
t[num[i]]=1;
dfs(num[i]);
}
}
}
bool cmp(s x,s y){
if(hig[x.en]!=hig[y.en]){
return hig[x.en]>hig[y.en];
}
else{
return x.wh<y.wh;
}
}
long long getfa(long long x){
if(fa[x]==x){
return x;
}
else{
return fa[x]=getfa(fa[x]);
}
}
int main(){
scanf("%lld%lld",&n,&m);
for(long long i=1;i<=n;i++){
scanf("%lld",&hig[i]);
}
for(long long i=1;i<=m;i++){
scanf("%lld%lld%lld",&a,&b,&arr[i].wh);
if(hig[a]<=hig[b]){
arr[i].st=b;
arr[i].en=a;
add(b,a,arr[i].wh);
}
if(hig[a]>=hig[b]){
arr[i].st=a;
arr[i].en=b;
add(a,b,arr[i].wh);
}
}
dfs(1);
printf("%lld ",ans);
ans=0;
for(long long i=1;i<=n;i++){
fa[i]=i;
}
sort(arr+1,arr+1+m,cmp);
long long tmp=0;
for(long long i=1;i<=m&&tmp<n-1;i++){
if(getfa(arr[i].st)==getfa(arr[i].en)){
continue;
}
else{
fa[getfa(arr[i].st)]=getfa(arr[i].en);
tmp++;
ans+=arr[i].wh;
}
}
printf("%lld",ans);
return 0;
}
代码写得很丑,大佬勿喷
回复
共 0 条回复,欢迎继续交流。
正在加载回复...