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