poj2186 Popular Cows

#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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章