标签:algo online clr tput ios for code 解析 input
传送门(poj):http://poj.org/problem?id=2186
(bzoj):http://www.lydsy.com/JudgeOnline/problem.php?id=1051
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 33482 | Accepted: 13638 |
Description
Input
Output
Sample Input
3 3 1 2 2 1 2 3
Sample Output
1
Hint
Source
#include<iostream> #include<cstdio> #include<algorithm> #include<map> using namespace std; #define N 10009 struct Edge { int x,y,next; Edge(int x=0,int y=0,int next=0): x(x),y(y),next(next){} }edge[N*5]; int sumedge,n,m,x,y,tim,top,sumclr,sumedge2,js,ans; int head[N],dfn[N],low[N],Stack[N],color[N],cnt[N],out[N],head2[N]; bool vis[N],instack[N]; void ins(int x,int y) { edge[++sumedge]=Edge(x,y,head[x]); head[x]=sumedge; } void ins2(int x,int y) { edge[++sumedge2]=Edge(x,y,head2[x]); head2[x]=sumedge2; } map<int,bool>Map[N]; void tarjan(int x) { dfn[x]=low[x]=++tim; vis[x]=1;instack[x]=1;Stack[++top]=x; for(int u=head[x];u;u=edge[u].next) if(instack[edge[u].y]) low[x]=min(low[x],dfn[edge[u].y]); else if(!vis[edge[u].y]) { tarjan(edge[u].y); low[x]=min(low[x],low[edge[u].y]); } else { } if(dfn[x]==low[x]) { sumclr++; color[x]=sumclr; cnt[sumclr]++; while(Stack[top]!=x) { color[Stack[top]]=sumclr;//染色 instack[Stack[top]]=0; top--; cnt[sumclr]++;//记录这个连通块里牛的个数 } instack[x]=0; top--; } } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { scanf("%d%d",&x,&y); ins(x,y); } for(int i=1;i<=n;i++) { if(!vis[i])tarjan(i); top=0; } for(int i=1;i<=n;i++) for(int u=head[i];u;u=edge[u].next) if(color[i]!=color[edge[u].y]) if(Map[color[i]].find(color[edge[u].y])==Map[color[i]].end()) //缩点 { Map[color[i]][color[edge[u].y]]=true; ins2(color[i],color[edge[u].y]); out[color[i]]++; } int cnnt=0; for(int i=1;i<=sumclr;i++) { if(out[i]==0)//度为0意味着所有牛都欢迎他 { js++; ans=i; cnnt+=cnt[i];//加上这个连通块里牛的个数 } } if(js>1||js==0)puts("0");//如果有大于1个的度为0的点,说明这个图不是连通的。 else printf("%d",cnnt); return 0; }
标签:algo online clr tput ios for code 解析 input
原文地址:http://www.cnblogs.com/zzyh/p/6840077.html