如果不连通怎么办?
查看原帖
如果不连通怎么办?
556362
Unnamed114514楼主2022/5/17 21:14

RT,过不了 Hack



#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int res=0;
	char ch=getchar();
	while(ch<'0'||ch>'9')
		ch=getchar();
	while(ch>='0'&&ch<='9'){
		res=(res<<1)+(res<<3)+(ch^'0');
		ch=getchar();
	}
	return res;
}
const int maxn=2e5+5,inf=0x3f3f3f3f;
int n,tot,num,l,r,dfn[maxn],low[maxn];
bool flg[maxn],v[maxn];
vector<int> G1[maxn],G2[maxn<<1];
stack<int> s;
void Tarjan(int u,int root){
	low[u]=dfn[u]=++tot;
	int cnt=0;
	s.push(u);
	for(int i=0,len=G1[u].size();i<len;++i){
		int v=G1[u][i];
		if(!dfn[v]){
			Tarjan(v,root);
			low[u]=min(low[u],low[v]);
			if(v!=root&&dfn[u]<=low[v]){
				flg[u]=1;
				++num;
				while(s.top()!=v){
                    G2[num].push_back(s.top());
                    G2[s.top()].push_back(num);
					s.pop();
				}
                G2[num].push_back(v);
                G2[v].push_back(num);
				s.pop();
                G2[num].push_back(u);
                G2[u].push_back(num);
			}
			++cnt;
		} else
			low[u]=min(low[u],dfn[v]);
	}
	if(u==root&&cnt>1)
		flg[u]=1;
}
void dfs(int u,int num){
	if(v[u])
		return;
	v[u]=1;
	if(u==r){
		if(num==inf)
			puts("No solution");
		else
			printf("%d\n",num);
		exit(0);
	}
	for(int i=0,len=G2[u].size();i<len;++i){
		int v=G2[u][i];
		if(v!=r&&flg[v])
			dfs(v,min(num,v));
		else
			dfs(v,num);
	}
}
int main(){
	num=n=read();
    while(1){
    	int u=read(),v=read();
    	if(!u&&!v)
			break;
    	G1[u].push_back(v);
    	G1[v].push_back(u);
	}
	for(int i=1;i<=n;++i)
		if(!dfn[i])
			Tarjan(i,i);
	l=read(),r=read();
	dfs(l,inf);
	puts("No solution");
	return 0;
}
2022/5/17 21:14
加载中...