爱在心中(codevs 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

/*
  tarjan求强连通分量,floyed进行关系更新
*/
#include<cstdio>
#include<iostream>
#include<vector>
#include<algorithm>
#include<stack>
#define M 1010
using namespace std;
int num[M],low[M],vis[M],instack[M],belong[M],in[M],indexx,cnt,n,m;
int b[M],a[M][M];
vector<int> grap[M];
vector<int> tuan[M];
stack<int> s;
void tarjan(int v)
{
    num[v]=low[v]=++indexx;
    s.push(v);
    vis[v]=1;
    instack[v]=1;
    for(int i=0;i<grap[v].size();i++)
    {
        int w=grap[v][i];
        if(!vis[w])
        {
            tarjan(w);
            low[v]=min(low[v],low[w]);
        }
        else if(instack[w])
          low[v]=min(low[v],num[w]);
    }
    int u;
    if(low[v]==num[v])
    {
        ++cnt;
        do
        {
            u=s.top();
            instack[u]=0;
            tuan[cnt].push_back(u);
            belong[u]=cnt;
            s.pop();
        }
        while(u!=v);
    }
}
void print(int x)
{
    for(int i=0;i<tuan[x].size();i++)
      b[i]=tuan[x][i];
    sort(b,b+tuan[x].size());
    for(int i=0;i<tuan[x].size();i++)
      printf("%d ",b[i]);
    printf("\n");
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int x,y;
        scanf("%d%d",&x,&y);
        grap[x].push_back(y);
    }
    for(int i=1;i<=n;i++)
      if(!vis[i])
        tarjan(i);
    int sum=0;
    for(int i=1;i<=cnt;i++)
      if(tuan[i].size()>1)
        sum++;
    printf("%d\n",sum);
    for(int i=1;i<=n;i++)
      for(int j=0;j<grap[i].size();j++)
        if(belong[i]!=belong[grap[i][j]])
          a[belong[i]][belong[grap[i][j]]]=1;
    for(int k=1;k<=cnt;k++)
      for(int i=1;i<=cnt;i++)
        for(int j=1;j<=cnt;j++)
          if(a[i][k]&&a[k][j])
            a[i][j]=1;
    for(int i=1;i<=cnt;i++)
      for(int j=1;j<=cnt;j++)
        if(a[i][j])
          in[j]++;
    int flag=0;
    for(int i=1;i<=cnt;i++)
      if(in[i]==cnt-1&&tuan[i].size()>1)
      {
          flag=1;
          print(i);
      }
    if(!flag)printf("-1");
    return 0;
}

时间: 2024-10-11 22:49:09

爱在心中(codevs 2822)的相关文章

习题:codevs 2822 爱在心中 解题报告

这次的解题报告是有关tarjan算法的一道思维量比较大的题目(真的是原创文章,希望管理员不要再把文章移出首页). 这道题蒟蒻以前做过,但是今天由于要复习tarjan算法,于是就看到codevs分类强联通分量里面只有这一道题. 题目是这样的: “每个人都拥有一个梦,即使彼此不相同,能够与你分享,无论失败成功都会感动.爱因为在心中,平凡而不平庸,世界就像迷宫,却又让我们此刻相逢Our Home.” 在爱的国度里有N个人,在他们的心中都有着一个爱的名单,上面记载着他所爱的人(不会出现自爱的情况).爱是

codevs 2822 爱在心中

codevs 2822 爱在心中 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description “每个人都拥有一个梦,即使彼此不相同,能够与你分享,无论失败成功都会感动.爱因为在心中,平凡而不平庸,世界就像迷宫,却又让我们此刻相逢Our Home.” 在爱的国度里有N个人,在他们的心中都有着一个爱的名单,上面记载着他所爱的人(不会出现自爱的情况).爱是具有传递性的,即如果A爱B,B爱C,则A也爱C.如果有这样一部分人,他们彼此都相爱,则

codevs 2822 爱在心中 tarjan(强联通分量)

2822 爱在心中 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description “每个人都拥有一个梦,即使彼此不相同,能够与你分享,无论失败成功都会感动.爱因为在心中,平凡而不平庸,世界就像迷宫,却又让我们此刻相逢Our Home.” 在爱的国度里有N个人,在他们的心中都有着一个爱的名单,上面记载着他所爱的人(不会出现自爱的情况).爱是具有传递性的,即如果A爱B,B爱C,则A也爱C.如果有这样一部分人,他们彼此都相爱,则他们就超越了一

【CodeVS 2822】爱在心中

“每个人都拥有一个梦,即使彼此不相同,能够与你分享,无论失败成功都会感动.爱因为在心中,平凡而不平庸,世界就像迷宫,却又让我们此刻相逢Our Home.” 在爱的国度里有N个人,在他们的心中都有着一个爱的名单,上面记载着他所爱的人(不会出现自爱的情况).爱是具有传递性的,即如果A爱B,B爱C,则A也爱C.如果有这样一部分人,他们彼此都相爱,则他们就超越了一切的限制,用集体的爱化身成为一个爱心天使.现在,我们想知道在这个爱的国度里会出现多少爱心天使.而且,如果某个爱心天使被其他所有人或爱心天使所爱

2822 爱在心中

2822 爱在心中 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description “每个人都拥有一个梦,即使彼此不相同,能够与你分享,无论失败成功都会感动.爱因为在心中,平凡而不平庸,世界就像迷宫,却又让我们此刻相逢Our Home.” 在爱的国度里有N个人,在他们的心中都有着一个爱的名单,上面记载着他所爱的人(不会出现自爱的情况).爱是具有传递性的,即如果A爱B,B爱C,则A也爱C.如果有这样一部分人,他们彼此都相爱,则他们就超

跟Google 学代码 :Building Apps with Content Sharing(跟女神去表白)

本篇博客都讲了些什么? 1. Sharing Simple Data 共享简单的数据,如文本,图片,URI 2. Sharing Files 共享文件 3. Sharing Files with NFC无线传输 在写博客之前,假设 "我"是服务端App,我的"女神"是客户端App 情书是"我"想传递的数据 那么我该如何做呢? 向客户端App发送数据(暗送秋波篇) 对女神爱在心中口难开怎么办?如何示爱这是穷学生最纠结的心病 在Android 开发中

BZOJ 1051 最受欢迎的牛 解题报告

题目直接摆在这里! 1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 4438  Solved: 2353[Submit][Status][Discuss] Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认为牛C受欢迎.你的任务是求出有多少头 牛被所有的牛

图论复习之强连通分量以及缩点—Tarjan算法

by RtPYH ------------------------------------------------------------------------------------------------ [强连通分量以及连通子图] #define# 在一个图的子图中,任意两个点相互可达,也就是存在互通的路径,那么这个子图就是强连通分量.(如果一个有向图的任意两个点相互可达,那么这个图就称为强连通图). [性质] 如果u是某个强连通分量的根,那么: (1)u不存在路径可以返回到它的祖先.

爱的世界很拥挤,写在读《爱,就这么简单》之后

这部小说是之前在看了<我是一个黑客>这部小说之后对这种类型小说起了兴趣,然后在网上搜索时网友推荐的.青春校园类型的,其中又包括真实的技术描写情节,正合我的胃口. 这部小说讲的是一个外号神童的天才少年吴神进入大学之后的成长经历以及与张妍.曾子墨两个女生之间的爱情故事.小说虽然有些烂尾,但是最终的结局还算是皆大欢喜. 故事的一开始神童的同班同学兼系花--张妍被他的独特的人格魅力所吸引,情不自禁地喜欢上神童,而神童也对张妍有好感,就这样两人渐渐坠入爱河,就在两人你侬我侬的时候,张妍的母亲--当时南京