#include<iostream>
#include<vector>
#include<algorithm>
#define pb push_back
using namespace std;
vector<int>v[1000001],t[1000001],sciezka,res;
bool odw[1000001];
int nie[1000001],na_sc[1000001],najd,ost,len,w_wyn[1000001];
bool zeg;
vector<int>zabr;
int n,m;
vector<pair<int,int> >zle;
void start(int x,vector <int> *g){
odw[x]=1;
if(na_sc[x]!=-1){
if(zeg){
if(ost<na_sc[x]){
zle.pb(make_pair(ost+1,na_sc[x]-1));
//cout<<"zle "<<ost+1<<" "<<na_sc[x]-1<<"\n";
}
zabr.pb(sciezka[(na_sc[x]+1)%len]);
}
else{
if(ost<na_sc[x]){
zle.pb(make_pair(na_sc[x]+1,ost-1));
//cout<<"zle "<<na_sc[x]+1<<" "<<ost-1<<"\n";
}
zabr.pb(sciezka[(na_sc[x]-1+len)%len]);
}
}
for(int i=0;i<g[x].size();i++){
if(zabr[zabr.size()-1]==g[x][i]||odw[g[x][i]])continue;
start(g[x][i],g);
}
if(na_sc[x]!=-1)zabr.pop_back();
}
int f(){
zeg=1;
for(int i=0;i<len;i++){
if(!odw[sciezka[i]]){
ost=i;
start(sciezka[i],v);
}
}
zeg=0;
//cout<<"--\n";
for(int i=0;i<n;i++)odw[i]=0;
for(int i=0;i<len;i++){
if(!odw[sciezka[i]]){
ost=i;
start(sciezka[i],t);
}
}
}
int koncz;
int vis[1000000];
bool cykl(int x){
vis[x]=1;
for(int i=0;i<v[x].size();i++){
if(vis[v[x][i]]==2||w_wyn[v[x][i]])continue;
if(vis[v[x][i]]==1){
koncz=v[x][i];
sciezka.pb(x);
return 1;
}
if(cykl(v[x][i])){
if(koncz!=-1)sciezka.pb(x);
if(x==koncz)koncz=-1;
return 1;
}
}
vis[x]=2;
return 0;
}
main(){
ios_base::sync_with_stdio(0);
cin>>n>>m;
for(int i=0;i<2*n;i+=2){
v[i].pb(i+1);
t[i+1].pb(i);
}
for(int i=0;i<m;i++){
int a,b;
cin>>a>>b;
a--;b--;
v[2*a+1].pb(2*b);
t[2*b].pb(2*a+1);
}
n*=2;
koncz=-1;
for(int i=0;i<n;i++){
if(!vis[i]&&sciezka.size()==0)cykl(i);
}
if(sciezka.size()==0){
cout<<"NIE\n";
return 0;
}
for(int i=0;i<n;i++)na_sc[i]=-1;
len=sciezka.size();
for(int i=0;i<(len)/2;i++)swap(sciezka[i],sciezka[len-1-i]);
//for(int i=0;i<len;i++)cout<<sciezka[i]<<" ";
//cout<<"\n";
for(int i=0;i<len;i++)na_sc[sciezka[i]]=i;
f();
for(int i=0;i<zle.size();i++){
zle[i].first=(zle[i].first+len)%len;
zle[i].second=(zle[i].second+len)%len;
if(zle[i].first>zle[i].second){
zle.push_back(make_pair(zle[i].first,len-1));
zle[i].first=0;
}
}
sort(zle.begin(),zle.end());
int it=0;
for(int i=0;i<zle.size();i++){
while(it<zle[i].first){
res.pb(sciezka[it++]);
}
it=max(it,zle[i].second+1);
}
while(it<len)res.pb(sciezka[it++]);
for(int i=0;i<res.size();i++)w_wyn[res[i]]=1;
for(int i=0;i<n;i++)vis[i]=0;
for(int i=0;i<n;i++){
if(!w_wyn[i]&&vis[i]==0&&cykl(i)){
cout<<0<<"\n";
return 0;
}
}
sort(res.begin(),res.end());
cout<<res.size()/2<<"\n";
for(int i=0;i<res.size();i+=2)cout<<res[i]/2+1<<" ";
cout<<"\n";
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 | #include<iostream> #include<vector> #include<algorithm> #define pb push_back using namespace std; vector<int>v[1000001],t[1000001],sciezka,res; bool odw[1000001]; int nie[1000001],na_sc[1000001],najd,ost,len,w_wyn[1000001]; bool zeg; vector<int>zabr; int n,m; vector<pair<int,int> >zle; void start(int x,vector <int> *g){ odw[x]=1; if(na_sc[x]!=-1){ if(zeg){ if(ost<na_sc[x]){ zle.pb(make_pair(ost+1,na_sc[x]-1)); //cout<<"zle "<<ost+1<<" "<<na_sc[x]-1<<"\n"; } zabr.pb(sciezka[(na_sc[x]+1)%len]); } else{ if(ost<na_sc[x]){ zle.pb(make_pair(na_sc[x]+1,ost-1)); //cout<<"zle "<<na_sc[x]+1<<" "<<ost-1<<"\n"; } zabr.pb(sciezka[(na_sc[x]-1+len)%len]); } } for(int i=0;i<g[x].size();i++){ if(zabr[zabr.size()-1]==g[x][i]||odw[g[x][i]])continue; start(g[x][i],g); } if(na_sc[x]!=-1)zabr.pop_back(); } int f(){ zeg=1; for(int i=0;i<len;i++){ if(!odw[sciezka[i]]){ ost=i; start(sciezka[i],v); } } zeg=0; //cout<<"--\n"; for(int i=0;i<n;i++)odw[i]=0; for(int i=0;i<len;i++){ if(!odw[sciezka[i]]){ ost=i; start(sciezka[i],t); } } } int koncz; int vis[1000000]; bool cykl(int x){ vis[x]=1; for(int i=0;i<v[x].size();i++){ if(vis[v[x][i]]==2||w_wyn[v[x][i]])continue; if(vis[v[x][i]]==1){ koncz=v[x][i]; sciezka.pb(x); return 1; } if(cykl(v[x][i])){ if(koncz!=-1)sciezka.pb(x); if(x==koncz)koncz=-1; return 1; } } vis[x]=2; return 0; } main(){ ios_base::sync_with_stdio(0); cin>>n>>m; for(int i=0;i<2*n;i+=2){ v[i].pb(i+1); t[i+1].pb(i); } for(int i=0;i<m;i++){ int a,b; cin>>a>>b; a--;b--; v[2*a+1].pb(2*b); t[2*b].pb(2*a+1); } n*=2; koncz=-1; for(int i=0;i<n;i++){ if(!vis[i]&&sciezka.size()==0)cykl(i); } if(sciezka.size()==0){ cout<<"NIE\n"; return 0; } for(int i=0;i<n;i++)na_sc[i]=-1; len=sciezka.size(); for(int i=0;i<(len)/2;i++)swap(sciezka[i],sciezka[len-1-i]); //for(int i=0;i<len;i++)cout<<sciezka[i]<<" "; //cout<<"\n"; for(int i=0;i<len;i++)na_sc[sciezka[i]]=i; f(); for(int i=0;i<zle.size();i++){ zle[i].first=(zle[i].first+len)%len; zle[i].second=(zle[i].second+len)%len; if(zle[i].first>zle[i].second){ zle.push_back(make_pair(zle[i].first,len-1)); zle[i].first=0; } } sort(zle.begin(),zle.end()); int it=0; for(int i=0;i<zle.size();i++){ while(it<zle[i].first){ res.pb(sciezka[it++]); } it=max(it,zle[i].second+1); } while(it<len)res.pb(sciezka[it++]); for(int i=0;i<res.size();i++)w_wyn[res[i]]=1; for(int i=0;i<n;i++)vis[i]=0; for(int i=0;i<n;i++){ if(!w_wyn[i]&&vis[i]==0&&cykl(i)){ cout<<0<<"\n"; return 0; } } sort(res.begin(),res.end()); cout<<res.size()/2<<"\n"; for(int i=0;i<res.size();i+=2)cout<<res[i]/2+1<<" "; cout<<"\n"; } |
English