强连通图中桥的求法是缩点后重新建图
#include<iostream>
#include<cstdio>
#include<string>
#include<ctime>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
#include<climits>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<cassert>
using namespace std;
// #define int long long
const int MAXN=1e6+10;
struct Edge{
int to,nxt;
bool cut;
int val;
}edge[MAXN];
int head[MAXN],tot=0;
int low[MAXN],dfn[MAXN],sta[MAXN];
int Index,top;
bool instack[MAXN],cut[MAXN];
int addblock[MAXN],belong[MAXN];
int bridge,block;
void addedge(int u,int v,int w){
edge[tot].to=v;edge[tot].nxt=head[u];
edge[tot].cut=false;edge[tot].val=w;
head[u]=tot++;
}
int viss[MAXN],num=0;
void tarjan(int u,int pre){
int v;
low[u]=dfn[u]=++Index;
sta[top++]=u;
instack[u]=true;
int precnt=0;
for(int i=head[u];~i;i=edge[i].nxt){
v=edge[i].to;
if(!dfn[v]){
tarjan(v,u);
num++;
// cout<<u<<" "<<v<<" "<<low[v]<<" "<<dfn[u]<<endl;
if(low[u]>low[v]) low[u]=low[v];
if(low[v]>dfn[u]){
bridge++;
edge[i].cut=true;
}
}else if(instack[v]&&low[u]>dfn[v]){
low[u]=dfn[v];
}
}
if(low[u]==dfn[u]){
block++;
do{
v=sta[--top];
instack[v]=false;
belong[v]=block;
}while(v!=u);
}
}
void init(){
tot=0;memset(head,-1,sizeof head);
}
int n,m;long long sum=0;
pair<int,int> pa[MAXN];
int out[MAXN],vss[MAXN];
void solve(int n){
memset(vss,0,sizeof vss);
memset(out,0,sizeof out);
memset(dfn,0,sizeof dfn);
memset(instack,false,sizeof instack);
memset(addblock,0,sizeof addblock);
memset(cut,false,sizeof cut);
Index=top=bridge=0;
int fl=0;
for(int i=1;i<=n;i++){
if(dfn[i]==0){
tarjan(i,i);
}
}
// cout<<block<<endl;
for(int i=1;i<=m;i++){
int a=pa[i].first,b=pa[i].second;
if(belong[a]!=belong[b]){
out[belong[a]]++;
}
}
vector<int> vv;
for(int i=1;i<=block;i++){
// cout<<out[i]<<endl;
if(out[i]==0) vv.push_back(i),vss[i]=1;
}
if(vv.size()==0){
cout<<endl;
}else{
for(int i=1;i<=n;i++){
if(vss[belong[i]]==1){
cout<<i<<" ";
}
}cout<<endl;
}
}
int main(){
while(scanf("%d",&n)&&n){
scanf("%d",&m);
init();
for(int i=1;i<=m;i++){
int a,b,c;scanf("%d%d",&a,&b);
pa[i].first=a;pa[i].second=b;
addedge(a,b,1);
// addedge(b,a,1);
// sum+=c;
}
solve(n);
}
}