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

    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

    分类标签 Tags 点此展开 

     
     
    解析:
    题目是要我们找图中有几个环(强连通分量),输出个数;
    如果其中一个环被其他环和单点指向,输出这个环的成员;否则输出-1
     
    那么,用塔软件找一下环,用floyed维护一下关系,就好了
     
    AC代码:
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<vector>
    #include<stack>
    #include<algorithm>
    using namespace std;
    #define N 1010
    int pd,sd,sum,low[N],dfn[N],mark[N],id[N];
    bool lj[N][N];
    vector<int>grap[N];
    vector<int>ans[N];
    stack<int>s;
    void tarjan(int v){
        low[v]=dfn[v]=++pd;
        s.push(v); 
        mark[v]=1;
        for(int i=0;i<grap[v].size();i++){
            int w=grap[v][i];
            if(!dfn[w]){
                tarjan(w);
                low[v]=min(low[v],low[w]);
            }
            else if(mark[w]){
                low[v]=min(low[v],dfn[w]);
            }    
        }
        int u;
        if(low[v]==dfn[v]){
            sd++;
            do{
                u=s.top();
                s.pop();
                id[u]=sd;
                ans[sd].push_back(u);
                mark[u]=0;
    
            }while(u!=v);
        }
    }
    void print(int x){
        sort(ans[x].begin(),ans[x].end());
        for(int i=0;i<ans[x].size();i++) printf("%d ",ans[x][i]);
    }
    int main(){
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=1,a,b;i<=m;i++){
            scanf("%d%d",&a,&b);
            grap[a].push_back(b);
        }
        for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);
        for(int i=1;i<=sd;i++) if(ans[i].size()>=2) sum++;    
        printf("%d
    ",sum);
        for(int i=1;i<=n;i++){ 
            for(int j=0;j<grap[i].size();j++){
                int k=grap[i][j];
                if(id[i]!=id[k]){
                    lj[id[i]][id[k]]=1;
                }
            }
        }
        int in[N]={0};
        for(int k=1;k<=sd;k++){
            for(int i=1;i<=sd;i++){
                for(int j=1;j<=sd;j++){
                    if(lj[i][k]&&lj[k][j]) lj[i][j]=1;
                }
            }
        }
        for(int i=1;i<=sd;i++){
            for(int j=1;j<=sd;j++){
                if(lj[i][j]) in[j]++;
            }
        }
        for(int i=1;i<=sd;i++){
            if(in[i]==sd-1&&ans[i].size()>=2){
                print(i);
                return 0;
            }
        }
        puts("-1");
        return 0;
    }
  • 相关阅读:
    CSS3 学习+实践(一)
    调试代码过程中遇到的问题
    python语法学习之函数,类,模块
    CSS3 学习+实践(二)
    网页打印A4纸表格在跨页时自动换页打印的实现
    python语法学习面向对象之继承
    CSS3 学习+实践(三)
    Python语法学习之文件操作
    Freeradius服务器的搭建流程
    当Log4net无法工作时启用trace(How to debug log4net while its not woking)
  • 原文地址:https://www.cnblogs.com/shenben/p/5742037.html
Copyright © 2011-2022 走看看