hdu2767

    xiaoxiao2023-11-11  139

    #include<cstdio> #include<cstring> #include<iostream> using namespace std; const int MAXN=200010; const int MAXM=500010; int tot=0; struct e{ int u,v,w; int nxt; }edge[MAXM]; int N,M; int head[MAXN],low[MAXN],dfn[MAXN],Stack[MAXN]; int Index,Belong[MAXN],degin[MAXN],degout[MAXN],num[MAXN]; bool Instack[MAXN]; int scc,top; void init(){ tot=0; memset(head,-1,sizeof(head)); } void add(int u,int v,int w){ edge[tot].u=u; edge[tot].v=v; edge[tot].w=w; edge[tot].nxt=head[u]; head[u]=tot++; } void tarjian(int u) { int v; low[u]=dfn[u]=++Index; // printf("low[%d]=%d\n",u,low[u]); // printf("dfn[%d]=%d\n",u,dfn[u]); Stack[top++]=u; Instack[u]=true; for (int i=head[u];i!=-1;i=edge[i].nxt) { int v=edge[i].v; if (!dfn[v]) { tarjian(v); if (low[u]>low[v]) low[u]=low[v]; } else if (Instack[v]&&low[u]>dfn[v]) low[u]=dfn[v]; } if (low[u]==dfn[u]) { scc++; do { v=Stack[--top]; Instack[v]=false; Belong[v]=scc; num[scc]++; } while(v!=u); } } void deal(){ memset(dfn,0,sizeof(dfn)); memset(Instack,false,sizeof(Instack)); top=Index=scc=0; memset(num,0,sizeof(num)); memset(degin,0,sizeof(degin)); memset(degout,0,sizeof(degout)); for (int i=1;i<=N;i++) { if (!dfn[i]) tarjian(i); } if (scc==1) { puts("0"); return; } int ret1=0,ret2=0; for (int i=0;i<tot;i++) { int v=Belong[edge[i].v]; int u=Belong[edge[i].u]; if (u==v) continue; degin[v]++; degout[u]++; } for (int i=1;i<=scc;i++) { if (degin[i]==0) ret1++; if (degout[i]==0) ret2++; } printf("%d\n",max(ret1,ret2)); } int main(){ int T; scanf("%d",&T); while (T--){ scanf("%d%d",&N,&M); init(); for (int i=0;i<M;i++) { int u,v; scanf("%d%d",&u,&v); add(u,v,9797); } deal(); } return 0; }
    最新回复(0)