• 【CodeVS2822】爱在心中


    Description

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

    在爱的国度里有N个人,在他们的心中都有着一个爱的名单,上面记载着他所爱的人(不会出现自爱的情况)。爱是具有传递性的,即如果A爱B,B爱C,则A也爱C。
    如果有这样一部分人,他们彼此都相爱,则他们就超越了一切的限制,用集体的爱化身成为一个爱心天使。
    现在,我们想知道在这个爱的国度里会出现多少爱心天使。而且,如果某个爱心天使被其他所有人或爱心天使所爱则请输出这个爱心天使是由哪些人构成的,否则输出-1。

    Input

    第1行,两个数N、M,代表爱的国度里有N个人,爱的关系有M条。
    第2到第M+1行,每行两个数A、B,代表A爱B。

    Output

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

    Sample Input

    样例输入1:

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


    样例输入2:

    3 3
    1 2
    2 1
    2 3

    Sample Output

    样例输出1:

    2
    2 3

    样例输出2:

    1
    -1

    HINT

    各个测试点1s

    题解

    第一问求强连通分量个数

    第二问求出度为0大小不为1的强连通分量

    注意:如果有两个这样的强连通分量,显然无解

    写的时候出现了两个错误,一个是tarjan忘退栈了,边表还写错了。。。

    #include<iostream>
    #include<cstdio>
    #define N 1000000
    using namespace std;
    struct edge_node
    {
        int to,next;
    }e[N],d[N];
    //int chudu[100];
    int head[N],h[N];
    bool instack [N];
    int stack [N];
    int dfn[N], low[N];
    int size[N],belong[N];
    int cnt,index,top,scc;
    int n,m,u,v;
    void tarjan(int u)
    { 
        dfn[u] = low[u] = ++index;
        instack[u] = true;
        stack[++top] = u;
        for (int i = head[u];i;i = e[i].next)
        {
            int v = e[i].to;
            if (instack[v])
            {
                low[u] = min(low[u],dfn[v]);
            }
            if (!dfn[v])
            {
                tarjan(v);
                low[u] = min(low[u],low[v]);
            }
        }
        if (low[u] == dfn[u])
        {
            scc++;
            int v = 0;
            for (;u!=v;)
            {
                v=stack[top--];
                instack[v] = false;
                belong[v] = scc;
                size[scc]++;
            }
        }
    }
    int main()
    {
        scanf("%d%d",&n,&m);
        for (int i=1;i<=m;i++)
        {
            scanf("%d%d",&u,&v);
            e[++cnt].to = v;
            e[cnt].next = head[u];
            head[u] = cnt;
        }
        for (int i=1;i<=n;i++)
            if (!dfn[i])
                tarjan(i);
        int ans1 = 0;
        for (int i=1;i<=scc;i++)
            if (size[i]!=1) ans1++;
        printf("%d
    ",ans1);
        cnt = 0;
        for (int i=1;i<=n;i++)
        {
            for (int j = head[i];j;j = e[j].next)
            {
                int v = e[j].to;
                if (belong[i] != belong[v])
                {
                    d[++cnt].to = belong[v];
                    d[cnt].next = h[belong[i]];
                    h[belong[i]] = cnt;
                //    chudu[belong[i]] ++;
                }
            }
        }
    //    printf("size:");
    //    for (int i=1;i<=scc;i++) printf("%d ",size[i]);printf("
    ");
    //    printf("chudu:");
    //    for (int i=1;i<=scc;i++) printf("%d ",chudu[i]);
        int pd =0;
        for (int i=1;i<=scc;i++)
        {
            if (!h[i] && size[i]!=1)
            {
                if (pd!=0) 
                {
                    pd = 0; 
                    break;
                }
                pd = i;
            }
        }
        if (pd)
        {
            for (int j=1;j<=n;j++)
                if (belong[j] == pd)
                    printf("%d ",j);
        }
        else printf("-1");
    }
  • 相关阅读:
    C语言I博客作业05
    C语言I博客作业04
    C语言II博客作业04
    C语言II博客作业03
    C语言II—作业02
    C语言II博客作业01
    学期总结
    C语言I博客作业08
    C语言I博客作业07
    C语言I博客作业06
  • 原文地址:https://www.cnblogs.com/liumengyue/p/5496029.html
Copyright © 2020-2023  润新知