This question is really a question close to (that is) tarjan board, and it is also a rare one without shrinking point.
That is to say, if the rope on a cow goes out in a clockwise direction and can come back after traversing all the time, it means that it can complete the round dance, and if a group of cows are in the same strong connected component, it can complete the round dance, and because it can only be accessed in a clockwise direction, it has a direction (I used to do it as a undirected graph, but I can get 90 points?).
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 #include<cstring> 6 #include<stack> 7 using namespace std; 8 const int M=500005; 9 10 stack < int > q; 11 int n,m,tot,t,ans; 12 int head[M],next[M],to[M],dfn[M],low[M],num[M]; 13 bool ok[M]; 14 15 int mi(int a,int b){return a<b?a:b;} 16 17 int read(){//Fast reading 18 int x=0,w=1; 19 char ch=getchar(); 20 while(ch>'9'||ch<'0'){ 21 if(ch=='-'){ 22 w=-1; 23 } 24 ch=getchar(); 25 } 26 while(ch<='9'&&ch>='0'){ 27 x=(x<<3)+(x<<1)+ch-'0'; 28 ch=getchar(); 29 } 30 return x*w; 31 } 32 33 void add(int u,int v){//Chain forward star, construct a directed edge from u to v 34 tot++; 35 next[tot]=head[u]; 36 head[u]=tot; 37 to[tot]=v; 38 } 39 40 void tarjan(int g){//tarjan board 41 dfn[g]=low[g]=++t; 42 ok[g]=1; 43 q.push(g); 44 for(int i=head[g];i;i=next[i]){ 45 if(!dfn[to[i]]){ 46 tarjan(to[i]); 47 low[g]=mi(low[g],low[to[i]]); 48 } 49 else if(ok[to[i]]){ 50 low[g]=mi(low[g],low[to[i]]); 51 } 52 } 53 if(dfn[g]==low[g]){ 54 int l=0; 55 while(q.top()!=g&&!q.empty()){ 56 l++; 57 ok[q.top()]=0; 58 q.pop(); 59 } 60 l++;//emm here can be done with do while, which I didn't remember before. 61 ok[q.top()]=0; 62 q.pop(); 63 ans+=(l>1);//We need to consider the case of a single point self forming strong connected component 64 } 65 } 66 67 int main(){ 68 n=read(); 69 m=read(); 70 while(m--){ 71 int u,v; 72 u=read(); 73 v=read(); 74 add(u,v);//Directed graph, a directed edge from u to v 75 //add(v,u); 76 } 77 for(int i=1;i<=n;i++){ 78 if(!dfn[i]){ 79 tarjan(i); 80 } 81 } 82 printf("%d\n",ans); 83 return 0; 84 }
Uh huh.