1.题目描述
2.输入输出样例
3.解题思路
很明显的DFS搜索图的问题,采用邻接矩阵建图。这里最关键的是怎么去搜索,我这里采用的搜索方法是搜索出所有路径,每搜索出一条路径ans++。同时,对应的这条路径上的每个点都相应的+1。最后DFS搜索完成后,如果对应的b[搜索过的点下标]==ans,就说明该点是每一条路径都要经过的点,即为关键点。最后统计出这样的点有多少个即可。(注意剪枝)
4.源代码
#include<bits/stdc++.h>
using namespace std;
#define maxn 1005
int n,m,u,v,ans;
int a[maxn][maxn];
int vis[maxn];
int b[maxn];
void DF(int u,int v) {
if(u==v) {
ans++;
for(int i=1; i<=n; i++)//将路径上的每个点都+1
if(i!=u && i!=v && vis[i]) b[i]++;
return;
}
for(int i=1; i<=n;i++) {
if(a[u][i]==1 && !vis[i]) {
vis[u]=1;//标志这个点已经被访问过了
DF(i,v);
vis[u]=0;//回溯的时候将走过的点标志为未走过,否则到达不了终点
}
}
}
int main() {
cin>>n>>m;
while(m--) {
int i,j=0;
cin>>i>>j;
a[i][j]=1;
a[j][i]=1;
}
cin>>u>>v;
DF(u,v);
int cnt=0;
if(!ans) {//若两点之间无通路,则返回-1
cnt=-1;
}
else {
for(int i=1; i<=n; i++)
if(i!=u && i!=v && b[i]==ans)
cnt++;//统计有多少个关键点
}
cout<<cnt<<endl;
return 0;
}
5.总结
一道经典的图论中的DFS搜索问题,思路上稍微有些改变,其他都是老一套。