暴力20,求助
查看原帖
暴力20,求助
482730
aSunnyDay楼主2023/10/18 22:49

4个点WA了,4个点TE

/*
每张图里面跑一次并查集
然后整个图跑并查集,记录的是符合条件的(a,b)组对
每次输入a,b,k,只要去看下(a,b)符合不符合情况
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=5009;
const ll D=209;
ll d,n,m,id[D][N],sz[N],ans;
ll find(ll d,ll x){
	if(id[d][x]==x) return x;
	return id[d][x]=find(d,id[d][x]);
}
void add(ll d,ll x,ll y){
	ll a=find(d,x),b=find(d,y);
	if(a==b) return; 
	id[d][a]=b;
	if(!d)sz[b]+=sz[a];
}
int main(){
	cin>>d>>n>>m,ans=n;
	for(ll i=0;i<=d;++i)
		for(ll j=1;j<=n;++j) id[i][j]=j;
	for(ll j=1;j<=n;++j) sz[j]=1;
	for(ll i=1;i<=m;++i){
		ll x,y,k;
		cin>>x>>y>>k;
		if(find(0,x)==find(0,y)){cout<<ans<<"\n";continue;} 
		bool ok=1;
		add(k,x,y);
		for(ll j=1;j<=d;++j)
			if(find(j,x)!=find(j,y)){ok=0;break;}
		if(ok)
			ans+=2*sz[find(0,x)]*sz[find(0,y)],add(0,x,y);
		cout<<ans<<"\n";
	}
	return 0;
}
2023/10/18 22:49
加载中...