DFS求两点间所有路径

2019-03-16  本文已影响0人  余生筑
#include<iostream>
#include<vector>
#include<cstring>
#include<algorithm>
#include<numeric>
#include<stack>
using namespace std;
const int MAXV=1001,INF=1000001;
int N,M,st,ed,cnt=0;
bool vest[MAXV];//若vest[i]已并入树中,则vest[i]=true;
int G[MAXV][MAXV];//图的边权值
int nex[MAXV];

void DFS(int i)
{
    vest[i]=true;
    if(i==ed)
    {
        cnt++;
        cout<<"第"<<cnt<<"条路径如下"<<endl;
        int k=st;
        while(k!=ed)
        {
            cout<<k+1<<"->";
            k=nex[k];
        }
        cout<<k+1<<endl;
        return;
    }

    for(int j=0; j<N; j++)
    {
        if(vest[j]==false&&G[i][j]!=INF)
        {
            nex[i]=j;//对于路径0->1->3: nex[0]=1;nex[1]=3;
            DFS(j);
            vest[j]=false;
        }
    }
}
int main()
{
    cin>>N>>M;//顶点数与边数
    fill(G[0],G[0]+MAXV*MAXV,INF);
    fill(vest,vest+MAXV,false);
    for(int i=0; i<M; i++)
    {
        int a,b;
        cin>>a>>b;
        G[a-1][b-1]=1;
        G[b-1][a-1]=1;
    }
    int u,v;
    cin>>u>>v;//起点与终点
    st=u-1;
    ed=v-1;
    DFS(st);
}
/*
输入:
5 7
1 2
1 3
1 4
1 5
2 4
3 5
3 4
1 4

输出:
第1条路径如下
1->2->4
第2条路径如下
1->3->4
第3条路径如下
1->4
第4条路径如下
1->5->3->4
*/
上一篇下一篇

猜你喜欢

热点阅读