[HAOI2006]受歡迎的牛(縮點)
阿新 • • 發佈:2018-10-29
include i++ ostream http tps ron == char www
題面
原題
Solution
考慮對於每一個環一定是滿足要求的,那麽他在這個環內而且所有的奶牛都要喜歡它,所以他一定沒有出邊且這個環是唯一的。
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #include<iostream> #include<queue> #include<algorithm> #define ll long long #define re register using namespace std; inline int gi(){ int f=1,sum=0;char ch=getchar(); while(ch>'9' || ch<'0'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0' && ch<='9'){sum=(sum<<3)+(sum<<1)+ch-'0';ch=getchar();} return f*sum; } int n,m; const int N=10010,M=50010; int to[M],nxt[M],front[N],cnt,dfn[N],low[N],sta[N],s,in[N],Time,all,color[N],out[N],ans,Max,siz[N]; void Add(int u,int v){ to[++cnt]=v;nxt[cnt]=front[u];front[u]=cnt; } struct E{ int a,b; }edge[M]; void Tarjan(int u){ dfn[u]=low[u]=++Time;in[u]=1;sta[++s]=u; for(re int i=front[u];i;i=nxt[i]){ int v=to[i]; if(!dfn[v]){ Tarjan(v); low[u]=min(low[u],low[v]); } else if(in[v])low[u]=min(low[u],dfn[v]); } if(dfn[u]==low[u]){ int v;all++; do{ v=sta[s--];siz[all]++; color[v]=all;in[v]=0; }while(v!=u); } } int main(){ n=gi();m=gi(); for(re int i=1;i<=m;i++){ int a=gi(),b=gi();Add(a,b); edge[i]=(E){a,b}; } for(re int i=1;i<=n;i++)if(!dfn[i])Tarjan(i); for(re int i=1;i<=m;i++){ int a=edge[i].a,b=edge[i].b; if(color[a]!=color[b])out[color[a]]++; } for(re int i=1;i<=all;i++) if(!out[i])ans++,Max=siz[i]; if(ans!=1)puts("0"); else printf("%d\n",Max); return 0; }
[HAOI2006]受歡迎的牛(縮點)