6339: 割边 给定一个n个点m条边的无向图,求割边数量。 输入 第一行,n,m 接下来m行,每行两个整数u,v,表示一条无向边(u,v)。 对于100%的数据,1<=n,m<=2 * 10^5。 输出 共一行,输出值为割边数量。 样例输入 6 7 1 2 2 3 3 1 3 4 4 5 5 6 4 6 样例输出 1 割边(也可以叫做桥):它割点差不多,在一个连通图里,去除一条边,使得该图不再连通,那么这条边就是割边,也称桥。 这题我们用到tarjan算法(不会可以上逼站看看 [算法]轻松掌握tarjan割点&桥算法_哔哩哔哩_bilibili) ac代码 #include<bits/stdc++.h> using namespace std; const int N=2e5+9; vector<int> a[N]; int sk[N],low[N],id=0,s=0; map<int,map<int,int> > ma; void tarjan(int x,int fa) { sk[x]=low[x]=++id; for(auto i:a[x]) { if(!sk[i]) { tarjan(i,x); low[x]=min(low[x],low[i]); if(low[i]>sk[x]) s++; } else if(i!=fa) low[x]=min(low[x],sk[i]); } } int main() { int n,m; cin>>n>>m; while(m--) { int x,y; cin>>x>>y; a[x].push_back(y); a[y].push_back(x); } for(int i=1;i<=n;i++) { if(!sk[i]) tarjan(i,-1); } cout<<s; } |