缩点后dfs不对吗?
查看原帖
缩点后dfs不对吗?
145216
KillerBoom楼主2022/11/7 14:20

本蒟蒻WA了最后一个点,求dalao解释QAQ

#include <bits/stdc++.h>
#define FAST ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
#define debug(x) cout<<endl<<#x<<": "<<x<<endl
#define endl "\n"
#define PII pair<int, int >
#define ls p << 1
#define rs (p << 1) + 1
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
const int N = 4e5 + 10;

int n;
int head[N], cnt;
int S, T;
struct Edge {
	int v, nxt;
} e[500010];

void add(int x, int y) {
	e[++cnt].v = y, e[cnt].nxt = head[x], head[x] = cnt;
	e[++cnt].v = x, e[cnt].nxt = head[y], head[y] = cnt;
}

int dfn[N], low[N], D, tot;
int stk[N], top;
bool cut[N];
vector <int > dcc[N];

void tarjan(int u, int rt) {
	dfn[u] = low[u] = ++D;
	stk[++top] = u;
	int flag = 0;
	for(int i = head[u]; i; i = e[i].nxt) {
		int v = e[i].v;
		if(!dfn[v]) {
			tarjan(v, rt);
			low[u] = min(low[u], low[v]);
			if(dfn[u] <= low[v]) {
				flag++;
				if(u != rt || flag >= 2) cut[u] = true;
				int cur;
				tot++;
				do {
					cur = stk[top--];
					dcc[tot].push_back(cur);
				} while(v != cur);
				dcc[tot].push_back(u);
			}
		} else low[u] = min(dfn[v], low[u]);
	}
}

vector <int > path, ne[N];
int id[N], bl[N], num;
unordered_map <int , int > mp;

void shrink() {
	num = tot;
	for(int i = 1; i <= n; ++i)
		if(cut[i]) {
			id[i] = ++num;
			mp[id[i]] = i;
		}
	
	for(int i = 1; i <= tot; ++i)
		for(int j : dcc[i]) {
			bl[j] = i;
			if(cut[j]) {
				ne[i].push_back(id[j]);
				ne[id[j]].push_back(i);
			}
		}	
}

int ans = 0x3f3f3f3f;

void dfs(int u, int fa, int mi) {
	if(u == bl[T]) {
		ans = min(ans, mi);
		return;
	}
	
	int tmp = mi;
	for(int v : ne[u]) {
		if(v == fa) continue;
		if(v > tot && v != bl[S] && v != bl[T]) tmp = min(tmp, mp[v]);
		dfs(v, u, tmp);
	}
}

signed main() {
	FAST;
	cin>>n;
	
	int x, y;
	while(cin>>x>>y) {
		if(!x) break;
		add(x, y);
	}
	cin>>S>>T;
	
	for(int i = 1; i <= n; ++i)
		if(!dfn[i]) tarjan(i, i);
	
	shrink();
	
	dfs(bl[S], 0, 0x3f3f3f3f);
	if(ans == 0x3f3f3f3f) cout<<"No solution";
	else cout<<ans;
	return 0;
}
2022/11/7 14:20
加载中...