#include<iostream>
using namespace std;
int n,m,u,v;//站点个数,通路个数,起点,终点
int map[1005][1005]={0};//邻接矩阵
int r[1005]={0};//记录是否走过该点
int num[1005]={0};//记录每个点在所有通路中出现次数
int ans=0;//记录通路条数
int main(){
void dfs(int x);
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>u>>v;
map[u][v]=map[v][u]=1;
}
cin>>u>>v;
r[u]=1;
dfs(u);
int res=0;//记录答案
for(int i=1;i<=n;i++){
if(num[i]==ans) res++;//如果该点在所有通路中出现的次数和通路出现的次数相等,那么该点一定是关键点
}
cout<<res-2;//记录时把起点终点也算进去了,所以要减去2
}
void dfs(int x){
if(x==v){//如果搜的这个点是终点,则是通路
ans++;//通路个数加一
for(int i=1;i<=n;i++){
if(r[i]) num[i]++;//在这条通路中出现的点次数加一
}
return;
}
for(int i=1;i<=n;i++){
if(r[i]) continue;//如果是已经走过的,继续循环
else if(map[x][i]){//(x,i)有路
r[i]=1;//标记i点已经走过
dfs(i);//寻找i以后的路
r[i]=0;//等到尝试完,取消标记这个点
}
}
}
顺带复习一下深搜,β胡罗卜素博主的代码写得很好,我这里放上他的代码
#include<iostream>
using namespace std;
int n, m, p, q, min = 999999;
int a[51][51], book[51][51];
void dfs(int x, int y, int step) {//其中的坐标为第x行的第y列,即(x,y),左上角即为(1,1)
int next[4][2] = {
{0,1},//向右
{1,0},//向下
{0,-1},//向左
{-1,0}//向上
};
int tx, ty, k;
//判断是否到达目的地
if (x == p && y == q) {
if (step < min) {
min = step;
return;
}
}
for (k = 0; k <= 3; k++) {
tx = x + next[k][0];
ty = y + next[k][1];
//不能越界
if (tx<1||ty<1||tx>n||ty>m)
{
continue;
}
if (a[tx][ty]==0&&book[tx][ty]==0)
{
book[tx][ty] = 1;//标记一下,走过了
dfs(tx, ty, step + 1);
book[tx][ty] = 0;//等到尝试完,取消标记这个点
}
}
return;
}
int main() {
int i, j, starX, starY;
cin >> n >> m;
for (i = 1; i <= n; i++) {
for (j = 1; j <= m; j++)
{
cin >> a[i][j];//输入地图
}
}
cin >> starX >> starY >> p >> q;//输入起点和终点的行列坐标
book[starX][starY] = 1;//标记起点已经走过
dfs(starX, starY, 0);
cout << min;
return 0;
}