调一晚上了,救救孩子吧
#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染色