||
https://www.luogu.org/problem/show?pid=2341
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 33470 | Accepted: 13634 |
Description
Input
Output
Sample Input
3 3 1 2 2 1 2 3
Sample Output
1
Hint
Source
1 #include <algorithm> 2 #include <cstring> 3 #include <cstdio> 4 5 using namespace std; 6 7 const int N(50015); 8 int n,m,u,v,sumchudu,ans,cnt; 9 int point[N],chudu[N]; 10 int sumedge,head[N]; 11 struct Edge 12 { 13 int from,to,next; 14 Edge(int from=0,int to=0,int next=0) : 15 from(from),to(to),next(next) {} 16 }edge[N]; 17 18 int ins(int from,int to) 19 { 20 edge[++sumedge]=Edge(from,to,head[from]); 21 return head[from]=sumedge; 22 } 23 24 int dfn[N],low[N],tim; 25 int Stack[N],top,instack[N]; 26 int col[N],sumcol; 27 28 void DFS(int now) 29 { 30 dfn[now]=low[now]= ++tim; 31 Stack[++top]=now; instack[now]=1; 32 for(int i=head[now];i;i=edge[i].next) 33 { 34 v=edge[i].to; 35 if(instack[v]) low[now]=min(low[now],dfn[v]); 36 else if(!dfn[v]) 37 DFS(v), low[now]=min(low[now],low[v]); 38 } 39 if(low[now]==dfn[now]) 40 { 41 col[now]= ++sumcol; 42 point[sumcol]++; 43 for(;Stack[top]!=now;top--) 44 { 45 point[sumcol]++; 46 col[Stack[top]]=sumcol; 47 instack[Stack[top]]=0; 48 } 49 instack[now]=0; top--; 50 } 51 } 52 53 int main() 54 { 55 scanf("%d%d",&n,&m); 56 for(int i=1;i<=m;i++) 57 scanf("%d%d",&u,&v),ins(u,v); 58 for(int i=1;i<=n;i++) 59 if(!dfn[i]) DFS(i); 60 for(int i=1;i<=m;i++) 61 { 62 u=edge[i].from; v=edge[i].to; 63 if(col[u]!=col[v]) chudu[col[u]]++; 64 } 65 for(int i=1;i<=sumcol;i++) if(!chudu[i]) 66 ++sumchudu,ans=point[i]; 67 if(sumchudu!=1) ans=0; 68 printf("%d\n",ans); 69 return 0; 70 }
POJ——T2186 Popular Cows || 洛谷——P2341 [HAOI2006]受欢迎的牛
原文:http://www.cnblogs.com/Shy-key/p/6827923.html