zoukankan      html  css  js  c++  java
  • [vijos]P1626 爱在心中

    描述

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

    样例1

    样例输入1

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

    样例输出1

    2
    2 3
    

    样例2

    样例输入2

    3 3
    1 2
    2 1
    2 3
    

    样例输出2

    1
    -1
    

    限制

    各个测试点1s

    提示

    对于40%的数据 N<=10 M<=100
    对于80%的数据 N<=100 M<=1000
    对于100%的数据 N<=1000 M<=10000

    来源

    Cai0715 原创
    NOIP 2009·Dream Team 模拟赛 第一期 第四题

    刚好学Tarjan,把这题也顺便水了

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<vector>
     4 #include<algorithm>
     5 #include<iterator>
     6 using namespace std;
     7 
     8 const int MAXN=10000+5;
     9 const int MAXM=50000+5;
    10 struct Edge
    11 {
    12     int to,next;
    13 }E[MAXM];
    14 int node,head[MAXM];
    15 int DFN[MAXN],LOW[MAXN],stack[MAXN];
    16 int vis[MAXN],size[MAXN],f[MAXN],num[MAXN];
    17 int index,top,tot,ans,t;
    18 
    19 int n,m;
    20 vector<int> V[MAXN];
    21 vector<int>::iterator iter;
    22 
    23 void insert(int u,int v)
    24 {
    25     E[++node]=(Edge){v,head[u]};head[u]=node;
    26 }
    27 
    28 void tarjan(int x)
    29 {
    30     DFN[x]=LOW[x]=++index;
    31     stack[++top]=x;
    32     vis[x]=1;
    33     for(int i=head[x];i;i=E[i].next)
    34     {
    35         if(!DFN[E[i].to])
    36         {
    37             tarjan(E[i].to);
    38             LOW[x]=min(LOW[x],LOW[E[i].to]);
    39         }
    40         else if(vis[E[i].to])
    41             LOW[x]=min(LOW[x],DFN[E[i].to]);
    42     }
    43     int now;
    44     if(LOW[x]==DFN[x])
    45     {
    46         tot++;
    47         if(x!=stack[top]) ans++;
    48         do
    49         {
    50             now=stack[top--];
    51             V[tot].push_back(now);
    52             size[tot]++;
    53             f[now]=tot;
    54             vis[now]=0;
    55         }while(x!=now);
    56     }
    57 }
    58 
    59 int main()
    60 {
    61     scanf("%d %d",&n,&m);
    62     for(int i=1;i<=m;i++)
    63     {
    64         int a,b;
    65         scanf("%d %d",&a,&b);
    66         insert(a,b);
    67     }
    68     for(int i=1;i<=n;i++)
    69         if(!DFN[i]) tarjan(i);
    70     for(int i=1;i<=n;i++)
    71         for(int j=head[i];j;j=E[j].next)
    72             if(f[i]!=f[E[j].to])
    73                 num[f[i]]++;
    74     printf("%d
    ",ans);
    75     for(int i=1;i<=tot;i++)
    76         if(!num[i])
    77         {
    78             if(t||size[i]==1)
    79             {
    80                 printf("-1
    ");
    81                 return 0;
    82             }
    83             t=i;
    84         }
    85     sort(V[t].begin(),V[t].end());
    86     for(iter=V[t].begin();iter!=V[t].end();iter++)
    87         cout<<*iter<<" ";
    88     return 0;
    89 }
  • 相关阅读:
    PHP 中的魔法常数
    Mac上tesseract-OCR的安装配置
    Java设计模式系列之迭代器模式
    Java设计模式系列之策略模式
    设计模式
    Java设计模式系列之单例模式
    SQl Server 中登录名 、用户、角色、概念一览
    数据结构知识点总结
    面试题收集——Java基础部分(一)
    XML学习总结(一)——XML介绍
  • 原文地址:https://www.cnblogs.com/InWILL/p/9343893.html
Copyright © 2011-2022 走看看