![]()
#include<iostream>
#include<set>
using namespace std;
int book[101],e[101][101];
int result[101][101];
int avoid[101];
int essent[101];
int avo,ess;
int stack[120],top=0;
int n,m;
int count;
int u,v;
int inf=999999;
void dfs(int cur){
if(cur == v){
count++;
cout<<"第"<<count<<"条路径:" ;
for(int i=0;i<top;i++){
result[count][i]=stack[i];
cout<<stack[i]<<' ';
}
cout<<v<<endl;
return;
}
book[cur]=1;
stack[top++]=cur;
for(int i=0;i<n;i++){
if(e[cur][i] ==1 && !book[i]){
dfs(i);
}
}
book[cur]--;
top--;
}
int length(int a[]){
int sum=0;
for(int i=0;i<=15;i++){
if(a[i]){
sum++;
}
}
return sum;
}
bool find(int a[],int b){
int k=length(a);
for(int i=0;i<k;i++){
if(b == a[i]){
return true;
}
}
return false;
}
int main(){
int a,b;
cout<<"请输入点的个数和边的个数和边的个数:"<<endl;
cin>>n>>m;
cout<<"清输入起点和终点:"<<endl;
cin>>u>>v;
cout<<"请输入必避点个数和一组必避点:"<<endl;
cin>>avo;
for(int i=0;i<avo;i++){
cin>>avoid[i];
}
cout<<"请输入必经点个数和一组必经点:"<<endl;
cin>>ess;
for(int i=1;i<=ess;i++){
cin>>essent[i];
}
//初始化二维矩阵
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i == j){
e[i][j]=0;
}else{
e[i][j]=inf;
}
}
}
cout<<"请输入无向图边的数据:"<<endl;
//读入顶点之间的边
for(int i=1;i<=m;i++){
cin>>a>>b;
e[a][b]=1;
e[b][a]=1;
}
book[u]=1;
cout<<endl;
cout<<u<<"->"<<v<<"的所有路径:"<<endl;
dfs(u);
cout<<"考虑必经点的路径:"<<endl;
for(int i=1;i<=count;i++){
int f=1;
int sum=length(result[i]);
for(int j=0;j<ess;j++){
if(!find(result[i],essent[j])){
f=0;
}
}
if(f){
for(int j=0;j<sum;j++){
cout<<result[i][j]<<' ';
}
cout<<v;
cout<<endl;
}
}
cout<<"考虑必避点的路径:"<<endl;
for(int i=1;i<=count;i++){
int f=1;
int sum=length(result[i]);
for(int j=0;j<avo;j++){
if(find(result[i],avoid[j])){
f=0;
}
}
if(f){
for(int j=0;j<sum;j++){
cout<<result[i][j]<<' ';
}
cout<<v;
cout<<endl;
}
}
return 0;
}
/*15 21
1 5
0 1
0 2
0 3
0 4
1 6
1 8
3 6
4 7
5 8
5 9
6 7
6 9
7 10
7 11
8 12
9 10
9 12
10 13
11 13
12 14
13 14*/