MnZn求助
  • 板块P6691 选择题
  • 楼主wjj255
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/16 00:15
  • 上次更新2023/11/2 13:31:01
查看原帖
MnZn求助
560342
wjj255楼主2023/10/16 00:15

调一晚上了,救救孩子吧

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
const int N=1e6+5;
const int M=998244353;
struct edge{
	int from,to,v;
}e[N];
int cnt,cnt2=1,cnt1,wrong,cnt3,ans;
vector<int> v[N];
queue<int> Q;
int p[N];
void add(int x,int y,int w)
{
	e[cnt].from=x;
	e[cnt].to=y;
	e[cnt].v=w;
	v[x].push_back(cnt);
	cnt++;
}
void chuli(int t)
{
	for(int i=0;i<v[t].size();i++){
		int x=e[i].from,y=e[i].to,v=e[i].v;
		cout<<y<<' ';
		
		if(p[y]==0){
			
			if(v){
				p[y]=p[x];
			}
			else{
				p[y]=3-p[x];
			}
			Q.push(y);
		}
		else{
			if(v){
				if(p[y]!=p[x]){
					//cout<<v<<' '<<p[y]<<' '<<p[x]<<endl;
					wrong=1;
					return;
				}
			}
			else if(p[y]!=3-p[x]){
				wrong=1;
				return;
			}
		}
	}
}
void bfs(int st)
{
	p[st]=1;
	Q.push(st);
	while(!Q.empty()){
		int t=Q.front();
		Q.pop();
		chuli(t);
		cnt3++;
		if(p[t]==1)cnt1++;
		if(wrong){
			cout<<"No answer\n";
			exit(0);
		}
	}
	if(cnt1>cnt3-cnt1)ans+=cnt1;
	else ans+=(cnt3-cnt1);
}
int main()
{
	freopen("P6691.in","r",stdin);
	int n,x,op;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>x>>op;
		add(i,x,op);
		add(x,i,op);
	}
	int gs=0;
//	for(int i=0;i<2*n;i++)cout<<e[i].from<<' '<<e[i].to<<endl;
	//cout<<endl;
	for(int i=1;i<=n;i++){
		if(p[i]==0){
			gs++;
			//for(int i=1;i<=n;i++)cout<<p[i]<<' ';
			//cout<<endl;
			bfs(i);
		}	
	}
	//cout<<endl;
	for(int i=1;i<=gs;i++){
		cnt2=cnt2*2%M;
	}
	//cout<<cnt2<<'\n'<<ans<<'\n'<<n-ans<<'\n';
	return 0;
}

思路是bfs染色

2023/10/16 00:15
加载中...