• VijosP1626:爱在心中


    描述

    “每个人都拥有一个梦,即使彼此不相同,能够与你分享,无论失败成功都会感动。爱因为在心中,平凡而不平庸,世界就像迷宫,却又让我们此刻相逢Our Home。”

    在爱的国度里有N个人,在他们的心中都有着一个爱的名单,上面记载着他所爱的人(不会出现自爱的情况)。爱是具有传递性的,即如果A爱B,B爱C,则A也爱C。

    如果有这样一部分人,他们彼此都相爱,则他们就超越了一切的限制,用集体的爱化身成为一个爱心天使。

    现在,我们想知道在这个爱的国度里会出现多少爱心天使。而且,如果某个爱心天使被其他所有人或爱心天使所爱则请输出这个爱心天使是由哪些人构成的,否则输出-1。

    格式

    输入格式

    第1行,两个数N、M,代表爱的国度里有N个人,爱的关系有M条。

    第2到第M+1行,每行两个数A、B,代表A爱B。

    输出格式

    第1行,一个数,代表爱的国度里有多少爱心天使。

    第2行,如果某个爱心天使被其他所有人和爱心天使所爱则请输出这个爱心天使是由哪些人构成的(从小到大排序),否则输出-1。

    输入:

    6 7
    1 2
    2 3
    3 2
    4 2
    4 5
    5 6
    6 4

    输出:

    2
    2 3

    思路:与POJ2186大同小异

    #include<cstdio>
    #include<cstring>
    #include<vector>
    #include<algorithm>
    using namespace std;
    const int MAXN=1005;
    int mp[MAXN][MAXN];
    int n,m;
    int dfn[MAXN],low[MAXN],index;
    int stack[MAXN],top;
    bool ins[MAXN];
    int belong[MAXN],cnt;
    void tarjan(int u)
    {
        dfn[u]=low[u]=++index;
        stack[top++]=u;
        ins[u]=true;
        for(int i=1;i<=n;i++)
        {
            if(mp[u][i])
            {
                if(!dfn[i])
                {
                    tarjan(i);
                    low[u]=min(low[u],low[i]);
                }
                else if(ins[i]) low[u]=min(low[u],dfn[i]);
            }
        }
        if(dfn[u]==low[u])
        {    
            int v;
            ++cnt;
            do{
                v=stack[--top];
                ins[v]=false;
                belong[v]=cnt;
            }while(u!=v);
        }
    }
    int outdeg[MAXN];
    int times[MAXN];
    void solve()
    {
        for(int i=1;i<=n;i++)
        {
            times[belong[i]]++;
            for(int v=1;v<=n;v++)
            {
                if(mp[i][v])
                {
                    if(belong[i]!=belong[v])
                    {
                        outdeg[belong[i]]++;
                    }
                }
            }
        }
        int res1=0;
        for(int i=1;i<=cnt;i++)
        {
            if(times[i]>1)
                res1++;
        }
        printf("%d
    ",res1);
        int mark;
        int res2=0;
        for(int i=1;i<=cnt;i++)
        {
            if(outdeg[i]==0&&times[i]>1)
            {
                res2++;
                mark=i;
            }
        }
        if(res2==1)
        {
            for(int i=1;i<=n;i++)
            {
                if(belong[i]==mark)
                    printf("%d ",i);
            }
        }
        else    printf("-1");
        printf("
    ");
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=0;i<m;i++)
        {
            int u,v;
            scanf("%d%d",&u,&v);
            mp[u][v]=1;
        }
        for(int i=1;i<=n;i++)
            if(!dfn[i])
                tarjan(i);
        solve();
        return 0;
    }

     

  • 相关阅读:
    Web Accessibility All In One
    CSS 3D Card Effect All In One
    Sololearn All In One
    In modern js you don't need void 0 anymore All In One
    医学科技解剖数字人 All In One
    SPAR19 航班航迹追踪 All In One
    HTML5 Games Development Foundation All In One
    HTML5 Canvas Games All In One
    python 中 如何提取或者删除列表的最后几个元素(适用于元组、字符串序列)
    c语言中输出整数类整型变量的长度(所占的字节数)
  • 原文地址:https://www.cnblogs.com/program-ccc/p/5384414.html
Copyright © 2020-2023  润新知