poj2186 Popular Cows

来源:互联网 发布:中国银行安全控件mac 编辑:程序博客网 时间:2024/05/17 15:05
#include <iostream>#include <algorithm>#include <vector>#include <queue>#include <stack>using namespace std;struct node{    int s,e;}arr[50010];vector<int> mat[10020];vector<int> tmat[10020];int n,m;int vis[15000];int mark[15000];int cnt[15000];int du[15000];stack<int >q;int num=0;void dfs(int start){    vis[start]=1;    for(int i=0;i<mat[start].size();i++)    {        if(!vis[mat[start][i]])        {            dfs(mat[start][i]);        }    }    q.push(start);    return;}void dfsop(int start){    vis[start]=1;    mark[start]=num;    cnt[num]++;    for(int i=0;i<tmat[start].size();i++)    {        if(!vis[tmat[start][i]])        {            dfsop(tmat[start][i]);        }    }}int main(){    cin>>n>>m;    node c;    //int cnt=0;    for(int i=1;i<=m;i++)    {        int s,e;        cin>>s>>e;        mat[s].push_back(e);        tmat[e].push_back(s);        c.s=s;        c.e=e;        arr[i]=c;    }    for(int i=1;i<=n;i++)    {        if(!vis[i])        {            dfs(i);        }    }    memset(vis,0,sizeof(vis));    while(!q.empty())    {        if(vis[q.top()]) {q.pop();continue;}        ++num;        dfsop(q.top());        q.pop();    }    for(int i=1;i<=m;i++)    {        int s=arr[i].s,e=arr[i].e;        if(mark[s]!=mark[e])        {            du[mark[s]]++;        }    }   // int judge=1;    //for(int i=1;i<=n;i++) cout<<mark[i]<<' ';    //cout<<endl;    //for(int i=1;i<=n;i++) cout<<du[i]<<' ';    //cout<<endl;    int sum=0;    int ppp=0;    for(int j=num;j>=1;j--)    {        if(du[j]==0) sum++;    }    for(int j=num;j>=1;j--)    {        if(du[j]==0) ppp=j;    }    if(sum==1)        cout<<cnt[ppp]<<endl;    else cout<<0<<endl;    return 0;}

0 0