codevs2822 爱在心中(tarjan求缩点的度)
来源:互联网 发布:sql not in 优化 编辑:程序博客网 时间:2024/05/19 13:59
题目描述 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
//我想的是入度数为scc-1,但是难以实现,结果发现用出度的关系更好表示 #include<cstdio>#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;const int mm=100000,mn=10000;int n,m,head[mn];int belong[mn],stack[mn],scc,top,num[mn],index1,cnt;struct node{int to,next;}edge[mm];int dfn[mn],low[mn];int out[mn];void tarjan(int u){stack[top++]=u;dfn[u]=low[u]=++index1;int v;for(int i=head[u];i!=-1;i=edge[i].next){v=edge[i].to;if(!dfn[v]){tarjan(v);if(low[u]>low[v]) low[u]=low[v];}else if(!belong[v]&&low[u]>dfn[v]) low[u]=dfn[v];}if(dfn[u]==low[u]){scc++;//cout<<endl;do{v=stack[--top];belong[v]=scc;num[scc]++;//cout<<v<<" ";}while(v!=u);//cout<<endl;if(num[scc]>1) cnt++;}}int main(){int u,v;scanf("%d%d",&n,&m);memset(head,-1,sizeof(head));for(int i=0;i<m;i++){scanf("%d%d",&u,&v);edge[i].to=v;edge[i].next=head[u];head[u]=i;}for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i);cout<<cnt<<endl;memset(dfn,0,sizeof(dfn));for(int i=1;i<=n;i++){for(int j=head[i];j!=-1;j=edge[j].next){u=edge[j].to;if(belong[u]!=belong[i]){if(belong[i]==1){//cout<<"gg : "<<i<<" "<<u<<endl;}out[belong[i]]=1;break;}}}int sum=0,f=0;for(int i=1;i<=scc;i++)if(!out[i]){sum++;f=i;}//cout<<"sum: "<<sum<<" f: "<<f<<endl;if(sum>1||sum==0){cout<<-1;return 0;}int a[mn],k=0;for(int i=1;i<=n;i++)if(belong[i]==f){a[k++]=i;}if(k==1){cout<<-1;return 0;}sort(a,a+k);for(int i=0;i<k;i++)cout<<a[i]<<" ";return 0;}
阅读全文
0 0
- codevs2822 爱在心中(tarjan求缩点的度)
- 【codevs2822】 爱在心中 tarjan+统计点的个数
- codevs2822 爱在心中
- Codevs2822 爱在心中
- codevs2822爱在心中
- codevs2822爱在心中
- 【codevs2822】爱在心中
- 【基础练习】【强连通tarjan】codevs2822 爱在心中题解
- Codevs2822爱在心中题解
- [CodeVS2822]爱在心中 做题笔记
- tarjan题目(2)爱在心中
- codevs 2822 爱在心中(Tarjan)
- codevs 2822 爱在心中(Tarjan 缩点)
- 爱在心中【tarjan + 缩点】
- [codevs 2822] 爱在心中 【tarjan 算法】
- VIJOS-P1626 爱在心中 tarjan
- Codevs 2822 爱在心中 [强连通分量] [Tarjan]
- <tarjan算法练习-缩点>codevs 2822 爱在心中
- 斐波那契数列的几种变体
- git使用
- React Native Realm安装 和 Realm入门理解
- 高阶篇:8.4)试模
- 如何在linux操作系统中安装vsftp服务
- codevs2822 爱在心中(tarjan求缩点的度)
- LintCode(加一)
- linux解压Zip文件
- SpringMvc的拦截器
- 函数指针数组-callback
- 爬虫数据分析-美食网站最爱甜点top10
- 硬件抽象层HAL
- python学习(三)
- java小算法—输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数