图论题目

 

 

#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*/

 

posted on 2020-05-09 09:52  二进制dd  阅读(243)  评论(0编辑  收藏  举报

导航