您的位置:首页 > 其它

【CodeVS2822】爱在心中

2016-05-15 20:33 302 查看

Description

“每个人都拥有一个梦,即使彼此不相同,能够与你分享,无论失败成功都会感动。爱因为在心中,平凡而不平庸,世界就像迷宫,却又让我们此刻相逢Our Home。”

在爱的国度里有N个人,在他们的心中都有着一个爱的名单,上面记载着他所爱的人(不会出现自爱的情况)。爱是具有传递性的,即如果A爱B,B爱C,则A也爱C。
如果有这样一部分人,他们彼此都相爱,则他们就超越了一切的限制,用集体的爱化身成为一个爱心天使。
现在,我们想知道在这个爱的国度里会出现多少爱心天使。而且,如果某个爱心天使被其他所有人或爱心天使所爱则请输出这个爱心天使是由哪些人构成的,否则输出-1。

Input

第1行,两个数N、M,代表爱的国度里有N个人,爱的关系有M条。
第2到第M+1行,每行两个数A、B,代表A爱B。

Output

第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

HINT

各个测试点1s

题解

第一问求强连通分量个数

第二问求出度为0大小不为1的强连通分量

注意:如果有两个这样的强连通分量,显然无解

写的时候出现了两个错误,一个是tarjan忘退栈了,边表还写错了。。。

#include<iostream>
#include<cstdio>
#define N 1000000
using namespace std;
struct edge_node
{
int to,next;
}e
,d
;
//int chudu[100];
int head
,h
;
bool instack
;
int stack
;
int dfn
, low
;
int size
,belong
;
int cnt,index,top,scc;
int n,m,u,v;
void tarjan(int u)
{
dfn[u] = low[u] = ++index;
instack[u] = true;
stack[++top] = u;
for (int i = head[u];i;i = e[i].next)
{
int v = e[i].to;
if (instack[v])
{
low[u] = min(low[u],dfn[v]);
}
if (!dfn[v])
{
tarjan(v);
low[u] = min(low[u],low[v]);
}
}
if (low[u] == dfn[u])
{
scc++;
int v = 0;
for (;u!=v;)
{
v=stack[top--];
instack[v] = false;
belong[v] = scc;
size[scc]++;
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
e[++cnt].to = v;
e[cnt].next = head[u];
head[u] = cnt;
}
for (int i=1;i<=n;i++)
if (!dfn[i])
tarjan(i);
int ans1 = 0;
for (int i=1;i<=scc;i++)
if (size[i]!=1) ans1++;
printf("%d\n",ans1);
cnt = 0;
for (int i=1;i<=n;i++)
{
for (int j = head[i];j;j = e[j].next)
{
int v = e[j].to;
if (belong[i] != belong[v])
{
d[++cnt].to = belong[v];
d[cnt].next = h[belong[i]];
h[belong[i]] = cnt;
//    chudu[belong[i]] ++;
}
}
}
//    printf("size:");
//    for (int i=1;i<=scc;i++) printf("%d ",size[i]);printf("\n");
//    printf("chudu:");
//    for (int i=1;i<=scc;i++) printf("%d ",chudu[i]);
int pd =0;
for (int i=1;i<=scc;i++)
{
if (!h[i] && size[i]!=1)
{
if (pd!=0)
{
pd = 0;
break;
}
pd = i;
}
}
if (pd)
{
for (int j=1;j<=n;j++)
if (belong[j] == pd)
printf("%d ",j);
}
else printf("-1");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: