poj2186Popular Cows

来源:互联网 发布:av小次郎 最新域名 编辑:程序博客网 时间:2024/04/26 18:56

牛群里的牛相互崇拜,这种崇拜是单向可传递的,要求最受崇拜的牛有几个,最受崇拜的牛是受其余所有牛的崇拜

用tarjan算法

完全抄袭的模板,写出来了还是各种转不出来

#include<stdio.h>#include<vector>#include<stack>#include<string.h>using namespace std;int n,m;vector<int> vec[100005];int vis[100005];int dfn[100005],low[100005];int gro_id[100000],gro[100005];stack<int> sta;int now,id;void tarjan(int s){    vis[s]=2;    now++;    dfn[s]=low[s]=now;    sta.push(s);    for(int i=0; i<vec[s].size(); i++)    {        if(vis[vec[s][i]]==0)        {            tarjan(vec[s][i]);            low[s]=low[s]<low[vec[s][i]]?low[s]:low[vec[s][i]];        }        else if(vis[vec[s][i]]==2)        {            low[s]=low[s]<dfn[vec[s][i]]?low[s]:dfn[vec[s][i]];        }    }    if(dfn[s]==low[s])    {        id++;        while(1)        {            int t=sta.top();            gro_id[t]=id;            vis[t]=1;            sta.pop();            gro[id]++;            if(t==s)                break;        }    }}int main(){    now=id=0;    memset(vis,0,sizeof(vis));    memset(dfn,0,sizeof(dfn));    memset(low,0,sizeof(low));    scanf("%d%d",&n,&m);    for(int i=1; i<=n; i++)        vec[i].clear();    for(int i=0; i<m; i++)    {        int a,b;        scanf("%d%d",&a,&b);        vec[a].push_back(b);    }    for(int i=1; i<=n; i++)        if(!vis[i])            tarjan(i);    memset(vis,0,sizeof(vis));    for(int i=1; i<=n; i++)        for(int j=0; j<vec[i].size(); j++)            if(gro_id[i]!=gro_id[vec[i][j]])            {                vis[gro_id[i]]=1;                break;            }    vector<int> ans;    for(int i=1; i<=id; i++)        if(vis[i]==0)            ans.push_back(i);    //printf("%d\n",ans.size());    if(ans.size()!=1)        printf("0\n");    else        printf("%d",gro[ans[0]]);    return 0;}
原创粉丝点击