Submission #3699

#TimeUsernameProblemLanguageResultExecution timeMemory
3699mjy0503Cactus? Not cactus? (kriii1_C)C++98
1 / 1
180 ms24632 KiB
#include <stdio.h> #include <algorithm> #include <string.h> #include <vector> #include <set> int n,top2=-1,stack2[200001],stack[200001],top=-1,save[200001],cnt[200001]; using namespace std; vector<int> list[200001],list2[200001]; set< pair<int,int> > edge; bool check[100001],flag,backedge; void back(int k){ int i; stack[++top]=k; while(top!=-1){ k=stack[top]; check[k]=1; for(;save[k]<list[k].size();save[k]++){ if(!check[list[k][save[k]]]){ list2[list[k][save[k]]].push_back(k); edge.insert(make_pair(list[k][save[k]],k)); stack[++top]=list[k][save[k]]; break; } else if(edge.find(make_pair(k,list[k][save[k]]))==edge.end()){ edge.insert(make_pair(list[k][save[k]],k)); cnt[list[k][save[k]]]++; list2[list[k][save[k]]].push_back(k); } } if(save[k]==list[k].size()){ top--; stack2[++top2]=k; } save[k]++; } } void flood(int k){ int i,sum=0; stack[++top]=k; while(top!=-1){ k=stack[top]; if(!check[k]) sum+=cnt[k]; check[k]=1; for(;save[k]<list2[k].size();save[k]++){ if(!check[list2[k][save[k]]]){ stack[++top]=list2[k][save[k]]; break; } } if(save[k]==list2[k].size()) top--; } if(sum>=2) flag=1; } int main(){ int m,i,a,b; scanf("%d %d",&n,&m); for(i=0;i<m;i++){ scanf("%d %d",&a,&b); a--;b--; list[a].push_back(b); list[b].push_back(a); } for(i=0;i<n;i++){ if(!check[i]) back(i); } for(i=0;i<n;i++){ check[i]=0;save[i]=0; } for(;top2>=0;top2--){ backedge=0; if(!check[stack2[top2]]) flood(stack2[top2]); } if(flag) printf("Not cactus\n"); else printf("Cactus\n"); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...