社区讨论

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 条回复,欢迎继续交流。

正在加载回复...