2822 爱在心中
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 钻石 Diamond
一个人不算天使,模板题稍微修改一下即可过
良心样例
#include <bits/stdc++.h>
inline int max(int a, int b){return a < b ? b : a;}
inline int min(int a, int b){return a < b ? a : b;}
inline void read(int &x){x = 0;char ch = getchar();char c = ch;while(ch > '9' || ch < '0')c = ch, ch = getchar();while(ch <= '9' && ch >= '0')x = x * 10 + ch - '0', ch = getchar();if(c == '-')x = -x;}
inline void read(long long &x){x = 0;char ch = getchar();char c = ch;while(ch > '9' || ch < '0')c = ch, ch = getchar();while(ch <= '9' && ch >= '0')x = x * 10 + ch - '0', ch = getchar();if(c == '-')x = -x;}
const int INF = 0x3f3f3f3f;
const int MAXN = 100000 + 10;
const int MAXM = 100000 + 10;
struct Edge
{
int u,v,next;
}edge1[MAXM];
int head1[MAXM],cnt1;
inline void insert1(int a, int b){edge1[++cnt1] = Edge{a, b, head1[a]};head1[a] = cnt1;}
Edge edge2[MAXM];
int head2[MAXN],cnt2;
inline void insert2(int a, int b){edge2[++cnt2] = Edge{a, b, head2[a]};head2[a] = cnt2;}
int n,m;
int stack[MAXN],top,t,group,belong[MAXN],dfn[MAXN],low[MAXN],num[MAXN];
bool b[MAXN], bb[MAXN];
int tmp1, tmp2;
int ans, ansgroup;
void dfs(int u)
{
dfn[u] = low[u] = ++t;
b[u] = bb[u] = true;
stack[++top] = u;
for(int pos = head1[u];pos;pos = edge1[pos].next)
{
int v = edge1[pos].v;
if(!b[v])
{
dfs(v);
low[u] = min(low[v], low[u]);
}
else if(bb[v] && low[u] > dfn[v])
{
low[u] = dfn[v];
}
}
if(low[u] == dfn[u])
{
group ++;
int now = 0;
while(now != u)
{
now = stack[top--];
belong[now] = group;
bb[now] = false;
num[group] ++;
}
if(num[group] > 1)ansgroup ++;
}
}
inline void rebuild()
{
for(int u = 1;u <= n;u ++)
{
for(int pos = head1[u];pos;pos = edge1[pos].next)
{
int v = edge1[pos].v;
if(belong[u] != belong[v])
{
insert2(belong[u], belong[v]);
}
}
}
}
inline void tarjan()
{
for(int i = 1;i <= n;i ++)if(!b[i])dfs(i);
rebuild();
}
int main()
{
read(n);read(m);
for(int i = 1;i <= m;i ++)
{
read(tmp1);read(tmp2);
insert1(tmp1, tmp2);
}
tarjan();
printf("%d
", ansgroup);
for(int i = 1;i <= group;i ++)
{
if(!head2[i])
{
if(ans)
{
ans = 0;break;
}
else if(num[i] != 1)
{
ans = i;
}
}
}
if(ans == 0)
{
printf("-1");
return 0;
}
for(int i = 1;i <= n;i ++)
{
if(belong[i] == ans)
{
printf("%d ", i);
}
}
return 0;
}