图论题目
#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*/