P2863 [USACO06JAN] The Cow Prom

Keywords: PHP

Problem surface

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.

Posted by leapingfrog on Fri, 01 Nov 2019 22:02:04 -0700