基本思路:使用递归求起点到终点的路径条数。然后统计图中点,在起点到
终点的所有路径中被经过的次数,只有被经过的次数和总路径条数相等的点才是关键点。
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
using namespace std;
const int maxn = 1e3+4;
vector<int>node[maxn];
int n,m,Start,End;
int pathNum[maxn]; //pathNum[i]起点到终点的路中,有几条经过i点。
int vis[maxn]; //vis[i]用来标记i点。
//dfs(s)求s点到终点的路径条数。s到终点的路径是其所有孩子到终点路径条数的和。
int dfs(int s) {
if(s == End) return 1;
int num = 0;
for(int i = 0; i < (int)node[s].size(); i++) {
int v = node[s][i];
if(vis[v]==0) {
vis[v] = 1;
num += dfs(v);
vis[v] = 0;
}
}
pathNum[s] += num;
return num;
}
int main() {
int u,v;
while(~scanf("%d%d",&n,&m)) {
for(int i = 1; i <= n; i++){
node[i].clear();
}
for(int i = 0; i < m; i++) {
scanf("%d%d",&u,&v);
node[u].push_back(v);
node[v].push_back(u);
}
scanf("%d%d",&Start,&End);
memset(vis,0,sizeof(vis));
memset(pathNum,0,sizeof(pathNum));
vis[Start] = 1;
int num = dfs(Start);
int ans = 0;
if(num == 0) {
printf("-1\n");
}
else {
for(int i = 1; i <= n; i++) {
if(num == pathNum[i] && i != Start) {
ans++;
}
}
printf("%d\n",ans);
}
}
return 0;
}