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

Tarjan缩点、求强连通分量,重新构图
被其他所有人爱 也就是入度等于强连通分量数-1
间接被爱也需要统计 
我用的是floyd 略慢,大佬们可改进 (大佬们肯定不会路过。。)。
注意图可能不连通 
屠龙宝刀点击就送
#include <ctype.h>
#include <cstdio>
#define N 100005void read(int &x)
{x=0;bool f=0;register char ch=getchar();for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=1;for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x=f?(~x)+1:x;
}
struct Edge
{int next,to;Edge (int next=0,int to=0) :next(next),to(to){}
};
struct Edge edge[N<<1];
int Map[300][300],in[N],newhead[N],tim,head[N],num[N],cnt,n,m,dfn[N],low[N],sumcol,col[N],stack[N],top;
bool instack[N],flag;
int min(int a,int b){return a>b?b:a;} 
void tarjan(int x)
{low[x]=dfn[x]=++tim;instack[x]=1;stack[++top]=x;for(int u=head[x];u;u=edge[u].next){int v=edge[u].to;if(!dfn[v]){tarjan(v);low[x]=min(low[x],low[v]);}else if(instack[v]) low[x]=min(low[x],dfn[v]);}if(low[x]==dfn[x]){sumcol++;int t;do{t=stack[top--];instack[t]=false;col[t]=sumcol;num[sumcol]++;}while(t!=x);}
}
void rebuild()
{for(int i=1;i<=n;i++){for(int u=head[i];u;u=edge[u].next){int v=edge[u].to;if(col[i]!=col[v]&&!Map[col[i]][col[v]]){Map[col[i]][col[v]]=1;in[col[v]]++;}}}for(int i=1;i<=sumcol;i++){for(int j=1;j<=sumcol;j++){for(int k=1;k<=sumcol;k++){if(j!=k&&k!=i&&i!=j){if(Map[j][i]&&Map[i][k]&&!Map[j][k]){Map[j][k]=1;in[k]++;}}}}}
}
int main()
{read(n);read(m);for(int x,y;m--;){read(x);read(y);edge[++cnt]=Edge(head[x],y);head[x]=cnt;}for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);int ans=0;for(int i=1;i<=sumcol;i++) if(num[i]>1) ans++;printf("%d\n",ans);rebuild();for(int i=1;i<=sumcol;i++){if(in[i]==sumcol-1&&num[i]>1) {for(int j=1;j<=n;j++)if(col[j]==i) printf("%d ",j);printf("\n");flag=true;}}if(!flag) printf("-1");return 0;
}

 

转载于:https://www.cnblogs.com/ruojisun/p/7204294.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/416361.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 遍历对象_python js对象的遍历

下面是两组数据格式&#xff1b;都是以对象的形势&#xff1b;现在我要将属性值提取出来&#xff1b;做成一个二级部门导航栏&#xff1b;abc里面的做一级&#xff0c;asd做二级点击厂一宣示对应的部门&#xff1b;点击厂二时候宣示对应的部门&#xff1b;把原有的隐藏var abc{…

最简单的基于FFmpeg的移动端样例:IOS 视频转码器

最简单的基于FFmpeg的移动端样例系列文章列表&#xff1a;最简单的基于FFmpeg的移动端样例&#xff1a;Android HelloWorld最简单的基于FFmpeg的移动端样例&#xff1a;Android 视频解码器最简单的基于FFmpeg的移动端样例&#xff1a;Android 视频解码器-单个库版最简单的基于F…

php去除英文和标点,php 过滤英文标点符号及过滤中文标点符号代码_php技巧

php 过滤英文标点符号 过滤中文标点符号 代码function filter_mark($text){if(trim($text))return ;$textpreg_replace("/[[:punct:]\s]/", ,$text);$texturlencode($text);$textpreg_replace("/(%7E|%60|%21|%40|%23|%24|%25|%5E|%26|%27|%2A|%28|%29|%2B|%7C|…

java调用js匿名函数参数,js匿名函数作为函数参数详解

由衷的感叹&#xff0c;js真是烦。学到现在&#xff0c;渐渐理解了什么是&#xff1a;语言都是通用的&#xff0c;没有好不好&#xff0c;只有擅长不擅长。继承&#xff0c;多态&#xff0c;甚至指针&#xff0c;c能实现&#xff0c;c&#xff0c;java有&#xff0c;javascript…

php 顺序结构,顺序存储结构php实现

// php实现顺序存储$arr [1,3];ListInsert($arr, 2, 6);var_dump($arr);$e GetElem($arr, 2);var_dump($e);// 顺序存储结构的插入function ListInsert(Array &$arr, int $i, int $e){$count count($arr);if($i < 1 || $i > $count 1){throw new Exception(‘数据…

PHP_CodeIgniter _remap重新定义方法

如果controller定义了_remap方法&#xff0c; 在_remap中重新定义方法 class Test extends CI_Controller{public function index(){echo "hello world";}//index.php/Test/success/id/1aapublic function _remap($method,$params){if($methodsuccess){$method . 2; …

php20个字,北京人会说不会写的20个字,第一个我就跪了

这20个字你们都会写吗?扽■ 【读音】dn■ 【释义】拉&#xff0c;猛拉&#xff0c;使伸直或平整。■ 【举例】快来人啊&#xff0c;我扽不住他啦!熥■ 【读音】tēng■ 【释义】把已经熟了的食物再加热。■ 【举例】馒头凉了&#xff0c;熥熥再吃。皴■ 【读音】cūn■ 【释义…

EC2的维护更新

&#xfeff;&#xfeff;2014年9月28日 近期几天。我们收到了一些客户关于我们即将进行维护更新的问题。下面是AWS全球Blog网站对这个问题的说明&#xff0c;供客户參照。 我们已经開始通知那些受影响的客户&#xff0c;关于我们即将实施的安全和维护的更新。我们须要在全球范…

matlab写函数进行坐标正反算,基于matlab的坐标正反算

《基于matlab的坐标正反算》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《基于matlab的坐标正反算(6页珍藏版)》请在人人文库网上搜索。1、基于 matlab 的坐标正反算测量程序设计实验报告实验名称 : 坐标正反算实验三坐标正反算一、实验目的编写坐标正反算程序 , 并…

【洛谷2986】【USACO10MAR】伟大的奶牛聚集

题面 题目描述 Bessie is planning the annual Great Cow Gathering for cows all across the country and, of course, she would like to choose the most convenient location for the gathering to take place. Each cow lives in one of N (1 < N < 100,000) differ…

工作73:获取id值

this.$route.params,id取值

hdu 5785 Interesting(manacher+前缀和)

题目链接&#xff1a;hdu 5785 Interesting 题意&#xff1a; 有一个长度为n的串&#xff08;n<10^6&#xff09;&#xff0c;对 1 < i < j < k < length(s) . 如果[i&#xff0c;j]和[j1,k]都是回文串。则对答案的贡献为 i*k ,求贡献和。 题解&#xff1a; 详细…