zoukankan      html  css  js  c++  java
  • P2341 受欢迎的牛

    luogu ——————

    思路和爱在心中差不多 爱在心中

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string> 
    #include<algorithm>
    #include<queue>
    #include<vector>
    using namespace std;
    int num[50009],head[10009],nxt[50009],dfn[10009],low[10009],color[10009],st[10009];
    int dfs_num=0,color_num=0,top=0,cnt=0;
    int n,m,ans=0,numc=0;
    bool vis[10009],f[10009];
    void Tarjan(int x)
    {
        st[++top]=x;
        dfn[x]=++dfs_num;
        low[x]=dfs_num;
        vis[x]=true;
    
        for(int i=head[x];i;i=nxt[i])
        {
            if(!dfn[num[i]]) 
            {
                Tarjan(num[i]);
                low[x]=min(low[num[i]],low[x]);
            }
            else if(vis[num[i]]) low[x]=min(low[x],dfn[num[i]]);
        }
    
        if(low[x]==dfn[x])
        {
            vis[x]=false;
            color[x]=++color_num;
            int t=0;
            while(st[top]!=x)
            {
                vis[st[top]]=false;
                color[st[top]]=color_num;
                top--;t++;
            }
            top--;t++;
            if(t==1) f[color_num]=true;
        }
    
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++)
        {
            int a,b;
            scanf("%d%d",&a,&b);
            cnt++;
            num[cnt]=b;
            nxt[cnt]=head[a];
            head[a]=cnt; 
        }
        for(int i=1;i<=n;i++)
         if(!dfn[i]) Tarjan(i);
    
        int cntc;
        for(int c=1;c<=color_num;c++)
        {
            cntc=0;
            for(int i=1;i<=n;i++)
            if(color[i]==c)
            {
                st[++cntc]=i;
            }
            bool flag=false;
            for(int x=1;x<=cntc;x++)
            {
                for(int i=head[st[x]];i;i=nxt[i])
                {
                    if(color[num[i]]!=c)// 有指出去的点,就不是 
                    {
                        flag=true;break;
                    }
                }
                if(flag) break;
            }
            if(flag) continue;
            if(!flag)
            {
                numc++;ans=c;
                if(numc>=2)
                {
                    printf("0
    ");
                    return 0;
                }   
            }
    
        }
        if(f[ans]) {printf("1
    ");return 0;}
        int fig=0;
        for(int i=1;i<=n;i++)
        {
            if(color[i]==ans)
            fig++;
        } 
    
        printf("%d",fig);
        return 0;
    }
  • 相关阅读:
    正则表达式
    寒假第三天
    起航
    写正则表达式心得(一)
    80后偷偷“变老”的20种表现
    数据库三大范式
    给从表添加主键。数据库备份方法
    appletouchicon 和 appletouchiconprecomposed的区别
    一些对前端开发有用的网站
    背景图可以随时自动调整大小jquery插件backstretch
  • 原文地址:https://www.cnblogs.com/dfsac/p/6819754.html
Copyright © 2011-2022 走看看