#include<iostream>#include<cstring>#include<cstdio>#include<queue>#include<cstdlib>#include<cmath>#include<map>#include<algorithm>usingnamespace std;#define ll long long#define lb long double#define INF 0x3f3f3f3f#define maxn 100005int n, m, cnt, deep, ans;int head[maxn], low[maxn], dfn[maxn], flag[maxn];struct node{int to;int next;}edge[maxn <<1];voidadd(int u,int v){
edge[cnt].to = v;
edge[cnt].next = head[u];
head[u]= cnt ++;}voidtarjan(int u,int fa){
deep ++;
low[u]= dfn[u]= deep;int child =0;for(int i = head[u]; i !=-1; i = edge[i].next){int v = edge[i].to;if(!dfn[v]){tarjan(v, u);
low[u]=min(low[u], low[v]);if(low[v]>= dfn[u]&& u != fa) flag[u]=1;elseif(u == fa) child ++;}else low[u]=min(low[u], dfn[v]);}if(u == fa && child >=2) flag[u]=1;}intmain(){int u, v;scanf("%d %d",&n,&m);for(int i =1; i <= n ;++ i) head[i]=-1;for(int i =1; i <= m ;++ i){scanf("%d %d",&u,&v);add(u, v);add(v, u);}for(int i =1; i <= n ;++ i){if(!dfn[i])tarjan(i, i);}for(int i =1; i <= n ;++ i){if(flag[i]) ans ++;}
cout << ans << endl;for(int i =1; i <= n ;++ i){if(flag[i]) cout << i <<" ";}return0;}
缩点
#include<iostream>#include<cstring>#include<cstdio>#include<queue>#include<cstdlib>#include<cmath>#include<stack>#include<map>#include<algorithm>usingnamespace std;#define ll long long#define lb long double#define INF 0x3f3f3f3f#define maxn 100010int n, m, cnt, deep, num, ct, maxi;int head[maxn], hd[maxn], vis[maxn], dfn[maxn], low[maxn], col[maxn], a[maxn], b[maxn], du[maxn], dp[maxn];
stack<int> s;struct node{int to;int next;}edge[maxn <<1], ed[maxn <<1];voidadd(int u,int v){
edge[cnt].to = v;
edge[cnt].next = head[u];
head[u]= cnt ++;}voidtarjan(int u){
deep ++;
dfn[u]= low[u]= deep;
vis[u]=1;
s.push(u);for(int i = head[u]; i !=-1; i = edge[i].next){int v = edge[i].to;if(!dfn[v]){tarjan(v);
low[u]=min(low[u], low[v]);}else{if(vis[v]){
low[u]=min(low[u], dfn[v]);}}}if(low[u]== dfn[u]){
col[u]=++ num;
vis[u]=0;while(s.top()!= u){
col[s.top()]= num;
vis[s.top()]=0;
s.pop();}
s.pop();}}intmain(){int u, v;scanf("%d %d",&n,&m);for(int i =1; i <= n ;++ i) head[i]=-1;for(int i =1; i <= n ;++ i) hd[i]=-1;for(int i =1; i <= n;++ i){scanf("%d",&a[i]);}for(int i =1; i <= m ;++ i){scanf("%d %d",&u,&v);add(u, v);}for(int i =1; i <= n ;++ i){if(!dfn[i]){tarjan(i);}}for(int i =1; i <= n ;++ i){
b[col[i]]+= a[i];}for(int i =1; i <= n ;++ i){for(int j = head[i]; j !=-1; j = edge[j].next){int uu = col[i], vv = col[edge[j].to];if(uu != vv){
ed[ct].to = vv; ed[ct].next = hd[uu]; hd[uu]= ct ++;
du[vv]++;}}}
queue<int> que;for(int i =1; i <= num ;++ i){
dp[i]= b[i];
maxi =max(maxi, dp[i]);/*if(hd[i] != -1)
cout << ed[hd[i]].to << endl;*/if(du[i]==0){
que.push(i);
du[i]=-1;}}while(!que.empty()){int cur = que.front();
que.pop();for(int i = hd[cur]; i !=-1; i = ed[i].next){int tt = ed[i].to;
du[tt]--;if(du[tt]==0){
dp[tt]=max(dp[tt], dp[cur]+ b[tt]);
maxi =max(maxi, dp[tt]);
que.push(tt);
du[tt]=-1;}}}
cout << maxi;return0;}