蓝桥杯 问题 1433: [蓝桥杯][2013年第四届真题]危险系数

本文介绍了一种计算图中特定两点间割点数量的算法。割点是指在两点间路径中必须通过的点,没有这些点,两点将无法直接相连。文章详细阐述了算法的实现思路,包括检查两点间是否存在路径,以及如何确定一个点是否为割点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

题目大意:给定已知一些点和点与点之间的通路,计算特定两点a,b之间的通路上必须要经过的点的个数(也就是说,如果没有这些点,a就不可以到达b,他们之间就不能构成通路,我们把这些必要的点称之为割点);

解题思路:

1.首先判断一下在不去除点的情况下a到b之间是否存在一条通路,如果不存在则输出-1,程序结束;若存在继续判断下去;

2.去除某个点c(注意c!=a并且也c!=b),去除之后若a,b之间不存在通路,则说明c是a,b之间必要的点,计数器加1;

以后对除了a,b所有的点都做以上2的操作,最后输出计数器,即为结果。

源码附上:

#include <iostream>
#include <cstring>
using namespace std;
int A[1001][1001],visit[1001];
int sstart, eend;
int flag;
int node, path;

void dfs(int cur,int drop)//表示丢掉drop点,sstart结点是否可以到达eend结点
{
	if (cur == eend)
	{
		flag = 1;
		return;
	}
	if (flag == 0)
	{
		for (int i = 1; i <= node; i++)
		{
			if (visit[i] == 0 && A[cur][i] == 1 && i != drop)//i结点未被访问并且cur和i结点联通
			{
				visit[i] = 1;
				A[cur][i] = A[i][cur]=0;
				dfs(i, drop);
				visit[i] = 0;
				A[cur][i] = A[i][cur] = 1;
			}
		}
	}
}

int main()
{
	cin >> node >> path;
	for (int i = 0; i < path; i++)
	{
		int x, y;
		cin >> x >> y;
		A[x][y] = A[y][x]=1;
	}
	cin >> sstart >> eend;
	flag = 0;
	visit[sstart] = 1;
	dfs(sstart,0);//判断sstart和eend是否联通
	
	//判断每个点是否是必要的
	int count=0;
	for (int i = 1; i <= node; i++)
	{
		if (i != sstart && i != eend)
		{
			memset(visit, 0, sizeof(visit));
			visit[sstart] = 1;
			flag = 0;
			dfs(sstart, i);
			if (flag == 0)
			{
				count++;
			}
		}	
	}
	cout << count << endl;
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值