zoukankan      html  css  js  c++  java
  • codeves 2822

    题目描述 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

    思路:强连通

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 const int N=10004;
     4 const int M=50004;
     5 
     6 struct node{
     7     int from,to,next;
     8 }e[M];
     9 int head[N],tot;
    10 int dfn[N],low[N],belong[N];
    11 int instack[N];
    12 int Stack[N],index1,top,bcnt;
    13 int chu[N];
    14 set<int >a[N];
    15 
    16 void add(int u,int v){
    17     e[tot].from=u;
    18     e[tot].to=v;
    19     e[tot].next=head[u];
    20     head[u]=tot++;
    21 }
    22 void init(){
    23     memset(dfn,0,sizeof(dfn));
    24     memset(head,-1,sizeof(head));
    25     index1=top=bcnt=0;
    26 }
    27 void tarjan(int u){
    28     dfn[u]=low[u]=++index1;
    29     instack[u]=1;
    30     Stack[++top]=u;
    31     for(int i=head[u];i!=-1;i=e[i].next){
    32         int v=e[i].to;
    33         if(!dfn[v]){
    34             tarjan(v);
    35             low[u]=min(low[u],low[v]);
    36          } else if(instack[v]){
    37             low[u]=min(low[u],dfn[v]);
    38         }
    39     }
    40     int v;
    41     if(dfn[u]==low[u]){
    42         bcnt++;
    43         do{
    44             v=Stack[top--];
    45             instack[v]=0;
    46             belong[v]=bcnt;
    47             a[bcnt].insert(v);
    48         } while(u!=v);
    49     }
    50 }
    51 int main(){
    52     int n,m;
    53     int x,y;
    54     init();
    55     scanf("%d%d",&n,&m);
    56     for(int i=1;i<=m;i++){
    57         scanf("%d%d",&x,&y);
    58         add(x,y);
    59     }
    60     for(int i=1;i<=n;i++)
    61         if(!dfn[i]) tarjan(i);
    62     int s=0;
    63     for(int i=1;i<=bcnt;i++){
    64         if(a[i].size()>1) s++;
    65     }
    66     printf("%d
    ",s);
    67     for(int i=0;i<tot;i++){
    68         x=e[i].from;
    69         y=e[i].to;
    70         if(belong[x]!=belong[y]){
    71             chu[belong[x]]++;
    72         }
    73     }
    74     int z;
    75     int sum=0;
    76     set<int >::iterator it;
    77     for(int i=1;i<=bcnt;i++){
    78         if(!chu[i]&&a[i].size()>1){
    79             sum++;
    80         }
    81     }
    82     if(sum==0||sum>1){
    83         printf("-1
    ");return 0;
    84     }
    85     for(int i=1;i<=bcnt;i++){
    86         if(!chu[i]&&a[i].size()>1){
    87             z=a[i].size();
    88             for(it=a[i].begin();it!=a[i].end();it++){
    89                 cout<<*it;z--;
    90                 if(z!=0) printf(" ");
    91             }
    92             printf("
    ");
    93         }
    94     }
    95     return 0;
    96 }
  • 相关阅读:
    js 变量提升和函数提升原理
    解析PHP中intval()等int转换时的意外异常情况
    不要太相信自己的眼睛
    遇到乱码时的一些想法
    c++ --> 变量、常量与运算符
    [ActionScript3.0] 逻辑或"||=" ,等于"=="和全等于"==="
    [ActionScript3.0] 传递任意数量的参数
    [ActionScript3.0] 深表复制
    [ActionScript3.0] 为内建类添加方法
    Jmeter之内存溢出解决办法
  • 原文地址:https://www.cnblogs.com/hhxj/p/7011260.html
Copyright © 2011-2022 走看看