求调
查看原帖
求调
759867
bk_by_sq楼主2023/8/18 20:39
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 5e5 + 10;
int n, h[N], cnt, low[N], dfn[N], tot, point[N], D_p[N], T, S, vis[N];
struct e
{
	int n, t;
}lb[N * 2];
void jb(int u, int v)
{
	lb[++cnt].n = h[u]; lb[cnt].t = v; h[u] = cnt;
}
bool dfs(int u, int f)
{
	vis[u] = 1;
	for(int i = h[u]; i; i = lb[i].n)
	{
		int v = lb[i].t;
		if(vis[v]) continue;
		vis[v] = 1;
		point[v] = 1;
		if(v == S) return 1;
		if(dfs(v, u)) return 1;
		point[v] = 0;
	}
	return 0;
}
void Dp(int u, int f)
{
	low[u] = dfn[u] = ++tot;
	int son = 0;
	for(int i = h[u]; i; i = lb[i].n)
	{
		int v = lb[i].t;
		if(!dfn[v])
		{
			Dp(v, u);
			son++;
			low[u] = min(low[u], low[v]);
			if(dfn[u] <= low[v] && f) D_p[u] = 1;
		}
		else low[u] = min(low[u], dfn[v]);
	}
	
	if(f == 0 && son >= 2)
	{
		 D_p[u] = 1;
//		 cout<<son<<"\n";
	}
	
}
int main()
{
	cin >> n;
	while(1)
	{
		int u, v; scanf("%d%d", &u, &v);
		if(u == 0 && v == 0) break;
		jb(u, v), jb(v, u); 
	}
	cin >> T >> S;
	vis[T] = 1;
	point[T] = 1;
	dfs(T, 0);
//	for(int i = 1; i <= n; i++)
//		cout<<point[i]<<" ";
//	cout<<"\n";
	Dp(1, 0);
//	for(int i = 1; i <= n; i++)
//		cout<<D_p[i]<<" ";
//	cout<<"\n";
	for(int i = 1; i <= n; i++)
		if(D_p[i] && point[i] && i != S && i != T)
		{
			cout<<i; return 0;
		}
	cout<<"No solution";
	return 0;
}

一个问题:从起点到终点的任意一条路径一定包含答案,,对吗qwqqwq

2023/8/18 20:39
加载中...