思路:
就是找必经之点
必经之路,不管怎么走都绕不开;
所以把所有的路径找出来,把所有的经过的节点入桶,如果结点出现的次数和路径条数一样,说明是必经点
#include<bits/stdc++.h>
using namespace std;
const int N = 1005;
/*
*/
int g[N][N];
int path[N]; //保存路径
int tong[N];
int vistd[N];
int n,m,s,t,cnt,ans;
//测试打印
void print_path(int len)
{
for(int i = 1;i < len -1;i++)
{
cout << path[i] << " ";
}
cout << endl;
}
//把当前路径经过的节点入桶
void push_t(int len)
{
for(int i = 1;i < len -1;i++)
{
tong[path[i]]++;
}
}
void dfs(int x,int step)
{
if(x == t) //如果找到终点
{
//保存路径长度
cnt++;
// print_path(step);
push_t(step);
return;
}
for(int i = 1;i <= n;i++)
{
if(g[x][i] && vistd[i] == 0)
{
vistd[i] = 1;
path[step] = i;
dfs(i,step + 1);
//回溯
vistd[i] = 0;
// path[cnt][step] = 0;
}
}
}
int main()
{
cin >> n >> m;
for(int i = 1;i <= m;i++)
{
int u,v;
cin >> u >> v;
g[u][v] = 1;
g[v][u] = 1;
}
cin >> s >> t;
dfs(s,1);
if(cnt == 0)
{
cout << -1 << endl;
return 0;
}
for(int i = 1;i <= n;i++)
{
// cout << cnt<< " " << i << " : "<< tong[i] << endl;
if(tong[i] == cnt) //如果结点出现的次数和路径数一致,则为必经之路
{
ans++;
}
}
cout << ans << endl;
return 0;
}