tarjan割边

模板题:洛谷P1656

code:

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
typedef pair<int,int> PII;
const int N=200;
vector<PII> edges[N];
vector<PII> ans;
int n,m,dfn[N],low[N],tot;
void tarjan(int u,int last){
    dfn[u]=low[u]=++tot;
    for(auto &[v,id]:edges[u]){
        if(id==last)
            continue;
        if(!dfn[v]){
            tarjan(v,id);
            low[u]=min(low[u],low[v]);
            if(low[v]>dfn[u]){
                ans.push_back({min(v,u),max(v,u)});
            }
        }
        else{
            low[u]=min(low[u],dfn[v]);
        }
    }
}
int main(){
    cin.tie(nullptr)->sync_with_stdio(false);
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        int u,v;
        cin>>u>>v;
        edges[u].push_back({v,i});
        edges[v].push_back({u,i});
    }
    tarjan(1,0);
    sort(ans.begin(),ans.end());
    for(auto &[a,b]:ans){
        cout<<a<<' '<<b<<endl;
    }
    return 0;
}
posted @ 2025-09-11 14:56  xdhking  阅读(5)  评论(0)    收藏  举报