HDU 3836

来源:互联网 发布:魔灵召唤淘宝代充 编辑:程序博客网 时间:2024/06/08 05:00
#include<stdio.h>#include<string.h>#include<stack>#include<string>#include<math.h>#include<queue>#include<set>#include<algorithm>#include<iostream>#include<vector>#include<map>using namespace std;#define LL long long#define inf 1<<30#define N 20010vector<int>edge[N];int low[N],dfn[N],belong[N],In[N],Out[N];stack<int>s;bool vis[N];int Index,cnt;void tarjan(int u){    int i,v;    low[u]=dfn[u]=++Index;    s.push(u);    vis[u]=1;    for(i=0;i<edge[u].size();i++)    {        v=edge[u][i];        if(dfn[v]==0)        {            tarjan(v);            low[u]=min(low[u],low[v]);        }        else if(vis[v]) low[u]=min(low[u],dfn[v]);    }    if(low[u]==dfn[u])    {        cnt++;        while(1)        {            v=s.top();s.pop();            belong[v]=cnt;            vis[v]=0;            if(v==u) break;        }    }}int main(){    int i,j,n,m,u,v,t;    while(scanf("%d%d",&n,&m)!=-1)    {        while(!s.empty()) s.pop();        for(i=1;i<=n;i++) edge[i].clear();        for(i=0;i<m;i++)        {            scanf("%d%d",&u,&v);            edge[v].push_back(u);        }        memset(dfn,0,sizeof(dfn));        memset(vis,0,sizeof(vis));        Index=cnt=0;        for(i=1;i<=n;i++)        {            if(!dfn[i])                tarjan(i);        }        memset(In,0,sizeof(In));        memset(Out,0,sizeof(Out));        for(u=1;u<=n;u++)        {            for(i=0;i<edge[u].size();i++)            {                v=edge[u][i];                if(belong[u]!=belong[v])                {                    In[belong[v]]++;                    Out[belong[u]]++;                }            }        }        int in=0,out=0;        for(i=1;i<=cnt;i++)        {            if(In[i]==0)in++;            if(Out[i]==0)out++;        }        if(cnt==1) printf("0\n");        else printf("%d\n",max(in,out));    }    return 0;}

0 0
原创粉丝点击