Tarjan求助
查看原帖
Tarjan求助
341329
Alexandra楼主2023/11/26 11:23

评测记录

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 1001000
long long n,a,b,dfn[N],low[N],num[N],chuo,w[N],cnt;
long long ver[N],Next[N],First[N],tot=-1;
inline long long read()
{
	long long wjl=0,jia=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-')jia*=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		wjl=(wjl<<1)+(wjl<<3)+(ch^48);
		ch=getchar();
	}
	return wjl*jia;
}
inline void add(long long x,long long y)
{
	ver[++tot]=y;
	Next[tot]=First[x];
	First[x]=tot;
}
void Tarjan(long long x,long long fa)
{
	dfn[x]=low[x]=++chuo;
	long long flag=0;
	for(long long i=First[x];~i;i=Next[i])
	{
		long long y=ver[i];
		if(y==fa)continue;
		if(!dfn[y])
		{
			Tarjan(y,x);
			low[x]=min(low[x],low[y]);
			if(low[y]>=dfn[x])flag++;
		}
		else low[x]=min(low[x],dfn[y]);
	}
	if(low[x]>=dfn[x])
	{
		for(long long i=First[x];~i;i=Next[i])
		{
			long long y=ver[i];
			if(low[y]>=dfn[x])w[++cnt]=x;
		}
	}
}
int main ()
{
	n=read();
	memset(First,-1,sizeof(First));
	while(1)
	{
		long long u=read(),v=read();
		add(u,v);
		add(v,u);
		if(u==0&&v==0)break;
	}
	a=read(),b=read();
	Tarjan(a,0);
	sort(w+1,w+1+cnt);
	for(long long i=1;i<=cnt;i++)
	{
		if(dfn[w[i]]<=dfn[b]&&w[i]!=b&&w[i]!=a)
		{
			printf("%lld\n",w[i]);
			return 0;
		}
	}
	printf("No solution\n");
	return 0;
}
2023/11/26 11:23
加载中...