5 pts 求调
查看原帖
5 pts 求调
401479
LuckiestShawn楼主2023/4/19 14:44

rt.

#include <iostream>
#include <stdio.h>
#include <map>
#define mod 1000000000
#define int long long
using namespace std;
int n,m,k,center;
int u[300003],v[300003],type[300003],fa[300003],e[300003];
int findfa(int u)
{
	if(fa[u]!=u)
		fa[u] = findfa(fa[u]);
	return fa[u];
}
void hebin(int u,int v)
{
	int fu = findfa(u),fv = findfa(v);
	if(fu!=fv)
		fa[fu] = fv;
	return ;
}
inline int pow(int a,int b)
{
	int ans = 1;
	while(b)
	{
		if(b&1)
			ans = (ans*a)%mod;
		a = (a*a)%mod;
		b >>= 1;
	}
	return ans;
}
int calc(int w)
{
	bool s;
	for(int i=1;i<=n+m-1;i++)
		fa[i] = i,e[i] = 0;
	for(int i=1;i<=k;i++)
	{
		if(u[i]==1&&v[i]==1)
			continue;
		
		s = w^type[i];
		if(u[i]%2||v[i]%2)
		{
			if(s==0)
				hebin(u[i],v[i]);
			else
			{
				if(findfa(u[i])==findfa(v[i]))
					return 0;
				if(e[u[i]]==0)
					e[u[i]] = v[i];
				if(e[v[i]]==0)
					e[v[i]] = u[i];
				hebin(u[i],e[v[i]]);
				hebin(e[u[i]],v[i]);
			}
		}
		else
		{
			if(s==1)
				hebin(u[i],v[i]);
			else
			{
				if(findfa(u[i])==findfa(v[i]))
					return 0;
				if(e[u[i]]==0)
					e[u[i]] = v[i];
				if(e[v[i]]==0)
					e[v[i]] = u[i];
				hebin(u[i],e[v[i]]);
				hebin(e[u[i]],v[i]);
			}
		}
		
		
	}
	int ans = 0;
	for(int i=1;i<=n+m-1;i++)
		if(findfa(i)==i)
			printf("%d ",i),
			ans++;
	printf("\n%d\n",ans-1);
	return pow(2,ans-1);
}
signed main()
{
	scanf("%lld%lld%lld",&n,&m,&k);
	center = -1;
	for(int i=1;i<=k;i++)
	{
		scanf("%d%d%d",&u[i],&v[i],&type[i]);
		if(u[i]==1&&v[i]==1)
			center = type[i];
		if(v[i]>1)
			v[i] = n+v[i]-1;
	}
	if(center!=-1)
		printf("%lld",calc(center));
	else
		printf("%lld",(calc(0)+calc(1))%mod);
	return 0;
}
2023/4/19 14:44
加载中...