标签:des style color java os io strong for
4 0 3 2 1 2 1 3
4 2HintCase 2: First prove set 2 is a subset of set 1 and then prove set 3 is a subset of set 1.
#include"stdio.h" #include"string.h" #include"queue" #include"vector" #include"algorithm" using namespace std; #define N 20005 #define M 50005 #define min(a,b) (a<b?a:b) const int inf=1000000; struct node { int u,v,next; }e[M]; int t,bcnt,index,stop,ans; int head[N],dfn[N],low[N],stap[N],mark[N],be[N]; int indeg[N],out[N]; void add(int u,int v) { e[t].u=u; e[t].v=v; e[t].next=head[u]; head[u]=t++; } void tarjan(int u) { int i,v; dfn[u]=low[u]=++index; stap[++stop]=u; mark[u]=1; for(i=head[u];i!=-1;i=e[i].next) { v=e[i].v; if(!dfn[v]) { tarjan(v); low[u]=min(low[u],low[v]); } else if(mark[v]) low[u]=min(low[u],dfn[v]); } if(low[u]==dfn[u]) { bcnt++; do { v=stap[stop--]; mark[v]=0; be[v]=bcnt; } while(u!=v); ans++; } } void solve(int n) { int i; memset(dfn,0,sizeof(dfn)); index=stop=bcnt=0; for(i=1;i<=n;i++) { if(!dfn[i]) tarjan(i); } } void work(int n) { int i,j,u,v,t1,t2; memset(indeg,0,sizeof(indeg)); memset(out,0,sizeof(out)); for(i=1;i<=n;i++) { u=be[i]; for(j=head[i];j!=-1;j=e[j].next) { v=be[e[j].v]; if(u!=v) { indeg[v]++; out[u]++; } } } t1=t2=0; for(i=1;i<=bcnt;i++) { if(indeg[i]==0) t1++; if(out[i]==0) t2++; } printf("%d\n",t1>t2?t1:t2); } int main() { int n,m,u,v; while(scanf("%d%d",&n,&m)!=-1) { t=0; memset(head,-1,sizeof(head)); while(m--) { scanf("%d%d",&u,&v); add(u,v); } ans=0; solve(n); // printf("%d\n",ans); if(ans==1) printf("0\n"); else work(n); } return 0; }
hdu 3836 Equivalent Sets(强连通分量--加边),布布扣,bubuko.com
hdu 3836 Equivalent Sets(强连通分量--加边)
标签:des style color java os io strong for
原文地址:http://blog.csdn.net/u011721440/article/details/38490781