求助第一次写二分图
  • 板块灌水区
  • 楼主fangzichang
  • 当前回复9
  • 已保存回复9
  • 发布时间2022/5/5 19:40
  • 上次更新2023/10/28 02:06:14
查看原帖
求助第一次写二分图
678087
fangzichang楼主2022/5/5 19:40

原题链接

#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10;
const int mod=998244353;
int t,n,m,last=1;
int ans,cnt;
int sum[N][2];
struct Node{
	vector<int> next;
	int color[2]={0,0};
}a[N];
bool flag=0,vis[N],f=0;
void dfs(int now){
	vis[now]=1;
	//cout<<"到达 "<<now<<endl;
	if(a[now].color[f]!=0){
		if(a[now].color[f]!=3-last){
			flag=1;
			return;
		}
	}
	a[now].color[f]=3-last;
	//cout<<"颜色为"<<a[now].color[f]<<endl; 
	last=3-last;
	if(last%2==1) sum[cnt][f]++;
	for(int i=0,len=a[now].next.size();i<len;i++){
		if(!vis[i]&&i){
			dfs(i);
		}
		else{
			if(a[i].color[f]!=3-a[now].color[f]&&a[i].color[f]!=0){
				flag=1;
				return;
			}
		}
	}
}
int kuaisu(int zs){
	if(zs==0) return 1;
	int x=2,res=1;
	while(zs--){
		if(zs%2){
			res*=x;
			res%=mod;
		}
		x=(x*x)%mod;
		zs>>1;
	}
	return res%mod;
}
int main(){
	cin>>t;
	while(t--){
		flag=0;
		ans=0;
		f=0;
		cnt=0;
		last=1;
		memset(vis,0,sizeof(vis));;
		for(int i=0;i<n;i++)
		{
			a[i].next.clear();
			a[i].color[1]=a[i].color[0]=0;
		}
		scanf("%d%d",&n, &m);
		int u,v;
		for(int i=0;i<m;i++){
			scanf("%d%d",&u, &v);
			a[u].next.push_back(v);
			a[v].next.push_back(u);
		}
		for(int i=1;i<=n;i++){
			if(!vis[i]){
				cnt++;
				dfs(i);
			} 
		}
		if(flag){
			printf("%d\n",0);
			continue;
		}
		for(int i=0;i<cnt;i++)
		{
			ans+=(kuaisu(sum[i][0]));
			ans%=mod;
		}
		memset(vis,0,sizeof(vis));	
		last=2;
		f=1;
		cnt=0;
		for(int i=1;i<=n;i++){
			if(!vis[i]){
				cnt++;
				dfs(i);
			} 
		}
		for(int i=0;i<cnt;i++)
		{
			ans+=(kuaisu(sum[i][1]));
			ans%=mod;
		}
		printf("%d\n",ans);				
	}
	return 0;
}

代码可能不好读,找了好久没找出错QAQ

就对了样例

放一组错误样例

输入:

6
8 7
2 3
3 4
4 5
5 2
6 7
7 8
8 6
1 0
2 1
1 2
3 3
1 2
2 3
1 3
3 2
2 3
3 1
4 4
1 2
2 3
3 4
4 1

样例输出:

0
3
4
0
6
8

跪求大佬救命

2022/5/5 19:40
加载中...