洛谷P2863 [USACO06JAN]牛的舞会The Cow Prom

代码是粘的,庆幸我还能看懂。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<stack>
#include<vector>

using namespace std;
struct node
{
    int num,par;
}p[10005];
int n,m,index=1,x,y,cnt;
vector<int>v[10005];
bool vis[10005];
int ind[10005];
stack<int>s;
bool in_stack[10005];
void tarjan(int x)
{
    p[x].num=index;
    p[x].par=p[x].num;
    index++;
    vis[x]=1;
    in_stack[x]=1;
    s.push(x);
    for(int i=0;i<v[x].size();i++)
    {
        if(!vis[v[x][i]])
        {
            tarjan(v[x][i]);
            p[x].par=min(p[x].par,p[v[x][i]].par);
        }
        else if(in_stack[v[x][i]])
        {
            p[x].par=min(p[x].par,p[v[x][i]].num);
        }
    }
    if(p[x].num==p[x].par)
    {
        ++cnt;
        int gutc=0;
        int k;
        do
        {
            k=s.top();
            s.pop();
            in_stack[k]=0;
            gutc++;
        }while(k!=x);
        if(gutc==1) cnt--;
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        v[x].push_back(y);
    }
    for(int i=1;i<=n;i++) if(!vis[i]) tarjan(i);
    printf("%d\n",cnt);
    return 0;
} 

 

posted @ 2017-05-25 16:54  杀猪状元  阅读(193)  评论(0编辑  收藏  举报