UOJ 67 新年的毒瘤
阿新 • • 發佈:2019-01-09
割點
非割點且度數=m-n+2的就是答案。
割點竟然沒一次寫對,智商已降低。
設根為1。對於非1節點,一定有父親的邊,則它是割點的充要條件是存在一個兒子的low>=自己的dfn。對於1節點,它是割點的充要條件是有至少兩個兒子。
MD,對於非1節點忘記判斷 x != 1了
#include<cstdio>
#define R register
#define N 100005
#define cmin(u,v) ((u)>(v)?(u)=(v):0)
using namespace std;
namespace runzhe2000
{
int last[N], ecnt, n, m , deg[N], cut[N], low[N], dfn[N], timer, out[N], cnt;
struct edge{int next, to;}e[N<<1];
inline void addedge(R int a, R int b)
{
e[++ecnt] = (edge){last[a], b};
last[a] = ecnt;
}
void tarjan(R int x)
{
low[x] = dfn[x] = ++timer;
R int siz = 0 ;
for(R int i = last[x]; i; i = e[i].next)
{
R int y = e[i].to;
if(!dfn[y])
{
tarjan(y); siz++;
cmin(low[x], low[y]);
if(x != 1 && low[y] >= dfn[x]) cut[x] = 1;
}
else cmin(low[x], dfn[y]);
}
if(x == 1 && siz > 1) cut[1] = 1;
}
void main()
{
scanf("%d%d",&n,&m);
for(R int i = 1, x , y; i <= m; i++)
{
scanf("%d%d",&x,&y);
deg[x]++; deg[y]++;
addedge(x, y);
addedge(y, x);
}
tarjan(1);
for(R int i = 1; i <= n; i++)
if(!cut[i] && deg[i] == m-n+2)
out[++cnt] = i;
printf("%d\n",cnt);
for(R int i = 1; i <= cnt; i++) printf("%d ",out[i]);
}
}
int main()
{
runzhe2000::main();
}