vector存无向图如何O(1)删除桥
查看原帖
vector存无向图如何O(1)删除桥
803885
_8008008楼主2024/10/19 18:30

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;
}
2024/10/19 18:30
加载中...