zoukankan      html  css  js  c++  java
  • codevs 2822 爱在心中

    codevs 2822 爱在心中

     

     时间限制: 1 s
     空间限制: 128000 KB
     题目等级 : 钻石 Diamond
    题目描述 Description

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

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

    输入描述 Input Description

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

    输出描述 Output Description

    第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

    数据范围及提示 Data Size & Hint

    各个测试点1s

      1 #include<iostream>
      2 using namespace std;
      3 #include<cstdio>
      4 #include<algorithm>
      5 #define N 10000
      6 #include<stack>
      7 stack <int> sta;
      8 bool instack[N]={false};
      9 int n,m;
     10 struct Edge{
     11     int u,v,last;
     12 }edge[N<<1];
     13 int dfn[N],low[N],father[N];
     14 int t=0,sum=0,head[N]={0},topt=0,outdu[N]={0},sumout=0,ans1[N],ans2[N];
     15 void add_edge(int u,int v)
     16 {
     17     edge[++t].v=v;
     18     edge[t].u=u;
     19     edge[t].last=head[u];
     20     head[u]=t;
     21 }
     22 void input()
     23 {
     24     scanf("%d%d",&n,&m);
     25     int u1,v1;
     26     for(int i=1;i<=m;++i)
     27     {
     28         scanf("%d%d",&u1,&v1);
     29         add_edge(u1,v1);
     30     }
     31 }
     32 void tarjan(int k)
     33 {
     34     dfn[k]=low[k]=++topt;
     35     sta.push(k);
     36     instack[k]=true;
     37     for(int l=head[k];l;l=edge[l].last)
     38     {
     39         if(dfn[edge[l].v]==0)
     40         {
     41             tarjan(edge[l].v);
     42             low[k]=min(low[k],low[edge[l].v]);
     43         }
     44         else if(instack[edge[l].v])
     45                 low[k]=min(low[k],dfn[edge[l].v]);
     46     }
     47     if(dfn[k]==low[k])
     48     {
     49         int js=0;
     50         int x;
     51         do
     52         {
     53             x=sta.top();
     54             sta.pop();
     55             father[x]=k;
     56             instack[x]=false;
     57             js++;
     58         }while(x!=k);
     59         if(js>=2)
     60           ans1[++ans1[0]]=k;
     61     }
     62 }
     63 bool work()
     64 {
     65     for(int i=1;i<=m;++i)
     66     {
     67         int x=father[edge[i].u];
     68         int y=father[edge[i].v];
     69         if(x==y) continue;
     70         outdu[x]++;
     71     }
     72     int comp;
     73     for(int i=1;i<=ans1[0];++i)
     74     {
     75         if(outdu[ans1[i]]==0) 
     76         {
     77             sumout++;
     78             comp=ans1[i];
     79         }
     80     }
     81     if(sumout!=1) return false;
     82     for(int i=1;i<=n;++i)
     83     {
     84         if(father[i]==comp)
     85         {
     86             ans2[++ans2[0]]=i;
     87         }
     88     }
     89     return true;
     90 }
     91 int main()
     92 {
     93     input();
     94     for(int i=1;i<=n;++i)
     95     {
     96         if(!dfn[i])
     97           tarjan(i);
     98     }
     99     printf("%d
    ",ans1[0]);
    100     if(work())
    101     {
    102         sort(ans2+1,ans2+ans2[0]+1);
    103         for(int i=1;i<=ans2[0];++i)
    104           printf("%d ",ans2[i]);
    105         printf("
    ");
    106     }else printf("-1
    ");
    107     return 0;
    108 }
  • 相关阅读:
    从尾到头打印链表-Python
    上台阶三种实现(斐波那契数列)-Python
    Windows/Linux安装python2.7,pycharm和pandas——《利用Python进行数据分析》
    部署(Django )
    第一个Django模型
    第一个Django Project(创建一个简单的博客)
    几个算法基础
    回文序列—Palindrome
    学习笔记:CentOS7学习之二十:shell脚本的基础
    学习笔记:CentOS7学习之十七: Linux计划任务与日志的管理
  • 原文地址:https://www.cnblogs.com/c1299401227/p/5750855.html
Copyright © 2011-2022 走看看