题目大意:给定已知一些点和点与点之间的通路,计算特定两点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;
}