最近在练Tarjan,看到这道题目分类在割点里面就想尝试做一下,点开发现题目数据范围竟然如此之小,算了,bfs暴力一发。

题目意思就是你需要找到一个关键节点,也可以理解成,行军打仗时必需经过的地方,敌军想从a点到b点必需经过的节点,在这个地方你一定能阻击到敌军,我感觉我比喻的应该还算形象。

既然如此,要找最小的这种节点,我们可以把节点1到n开始枚举,如果不经过这个节点所相连的边还能到达终点,那么这个节点就是不合理的,反之,能到达终点,这个节点就是合理的。

#include<bits/stdc++.h>
using namespace std;
int visit[1000];
vector<int> vec[1000];
int n;

void bfs(int s,int limit){
	memset(visit,0,sizeof(visit));
	queue<int> q;
	q.push(s);
	visit[s]=1;
    while(!q.empty()){
    	int from=q.front();
    	q.pop();
    	for(int i=0;i<vec[from].size();++i){
    		int to=vec[from][i];
    		if(!visit[to]&&to!=limit){  //不能经过限制节点
    			//cout<<to<<endl;
    			visit[to]=1;
    			q.push(to);
			}
		}
	}
}

int main(){
	scanf("%d",&n);
	int x,y;
	while(~scanf("%d%d",&x,&y)&&x+y!=0){
		vec[x].push_back(y);
		vec[y].push_back(x);
	}
	int a,b;
	scanf("%d%d",&a,&b);
    for(int i=1;i<=n;++i){
    	if(i==a||i==b)  continue;
        bfs(a,i);
        if(!visit[b]){
        	cout<<i<<endl;return 0;
		} 
	}
	cout<<"No solution"<<endl;
}

  

版权声明:本文为chendongyu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/chendongyu/p/14374510.html