1. 程式人生 > >UOJ 67 新年的毒瘤

UOJ 67 新年的毒瘤

割點

非割點且度數=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(); }