#include<stdlib.h> #include<stdio.h> #include<algorithm> #include<iostream> #include<set> #include<vector> #include<string.h> typedef long long LL; typedef unsigned long long ULL; using namespace std; set<int> wynik; vector<int>stos; vector<int>graf[500100]; bool visited[500100]; bool niegra[500100]; bool cykle(int v, int w) { if(niegra[w])return false; bool ret = false; visited[w]=true; stos.push_back(w); for(auto u=graf[w].begin();u!=graf[w].end();u++) { if(*u == v) { set<int> tmp(stos.begin(), stos.end()); set<int>tmp2; // for(auto it=tmp.begin();it!=tmp.end();it++)printf("%d ",*it); // printf("\n"); set_intersection(wynik.begin(), wynik.end(), tmp.begin(), tmp.end(), inserter(tmp2,tmp2.begin())); wynik=tmp2; // printf("wynik: "); // for(auto it=wynik.begin();it!=wynik.end();it++)printf("%d ",*it); // printf("\n"); return true; } if(visited[*u]==false && cykle(v,*u)) return true; } stos.pop_back(); return false; } int main() { int n,m,t; scanf("%d%d",&n,&m); for (int i=0;i<m;i++) { int m1,m2; scanf("%d%d",&m1, &m2); graf[m1-1].push_back(m2-1); } for(int i=0;i<n;i++) { wynik.insert(i); } bool c=false; for(int i=0;i<n;i++) { memset(visited,false,sizeof(bool)*n); stos.clear(); if(cykle(i,i))c=true; } if(!c) { printf("NIE\n"); return 0; } printf("%d\n",wynik.size()); for(auto it=wynik.begin();it!=wynik.end();it++)printf("%d ",*it+1); return 0; }
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 | #include<stdlib.h> #include<stdio.h> #include<algorithm> #include<iostream> #include<set> #include<vector> #include<string.h> typedef long long LL; typedef unsigned long long ULL; using namespace std; set<int> wynik; vector<int>stos; vector<int>graf[500100]; bool visited[500100]; bool niegra[500100]; bool cykle(int v, int w) { if(niegra[w])return false; bool ret = false; visited[w]=true; stos.push_back(w); for(auto u=graf[w].begin();u!=graf[w].end();u++) { if(*u == v) { set<int> tmp(stos.begin(), stos.end()); set<int>tmp2; // for(auto it=tmp.begin();it!=tmp.end();it++)printf("%d ",*it); // printf("\n"); set_intersection(wynik.begin(), wynik.end(), tmp.begin(), tmp.end(), inserter(tmp2,tmp2.begin())); wynik=tmp2; // printf("wynik: "); // for(auto it=wynik.begin();it!=wynik.end();it++)printf("%d ",*it); // printf("\n"); return true; } if(visited[*u]==false && cykle(v,*u)) return true; } stos.pop_back(); return false; } int main() { int n,m,t; scanf("%d%d",&n,&m); for (int i=0;i<m;i++) { int m1,m2; scanf("%d%d",&m1, &m2); graf[m1-1].push_back(m2-1); } for(int i=0;i<n;i++) { wynik.insert(i); } bool c=false; for(int i=0;i<n;i++) { memset(visited,false,sizeof(bool)*n); stos.clear(); if(cykle(i,i))c=true; } if(!c) { printf("NIE\n"); return 0; } printf("%d\n",wynik.size()); for(auto it=wynik.begin();it!=wynik.end();it++)printf("%d ",*it+1); return 0; } |