rt,tarjan找到桥了只能删掉一条有向边
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
const int maxn=500005;
int n,m,cnt;
int dfn[maxn],low[maxn];
vector<int>e[maxn];
stack<int>st;
vector<vector<int> >ans;
bool vis[maxn];
void tarjan(int u){
dfn[u]=low[u]=++cnt;
for(int i=0;i<e[u].size();i++){
int v=e[u][i];
if(dfn[v]!=0){
low[u]=min(low[u],dfn[v]);
}else{
tarjan(v);
low[u]=min(low[u],low[v]);
if(dfn[u]<low[v]);
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
int u,v;
scanf("%d%d",&u,&v);
e[u].push_back(v);
e[v].push_back(u);
}
for(int i=1;i<=n;i++){
if(dfn[i]==0)tarjan(i);
}
return 0;
}