题目描述
假设无向图G采用邻接矩阵存储,设计一个算法,输出图G中从顶点u到v的所有简单路径。
输入
简单路径是指路径上的顶点不重复。第一行为一个整数n,表示顶点的个数(顶点编号为0到n-1),第二行表示顶点u和v的编号,接下来是为一个n*n大小的矩阵,表示图的邻接关系。数字为0表示不邻接,1表示不邻接。
输出
输出图G中从顶点u到v的所有简单路径。
样例输入
5
0 3
0 1 0 1 1
1 0 1 1 0
0 1 0 1 1
1 1 1 0 1
1 0 1 1 0
样例输出
0123
01243
013
03
04213
0423
043
#include <iostream>
using namespace std;
int n;
int start,last;
const int N = 1010;
int st[N], path[N];
int g[N][N];
void dfs(int u, int t)
{
path[t] = u;
if(u == last){
for(int i = 0; i < t; i++){
cout<<path[i];
}
cout<<last<<endl;
return;
}
st[u] = 1;
for(int i = 0; i < n; i++){
if(st[i] == 0&&g[u][i]==1) dfs(i, t + 1);
}
st[u] = 0;
}
int main()
{
cin>>n;
cin>>start>>last;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
cin>>g[i][j];
}
}
dfs(start, 0);
return 0;
}
注释版
#include <iostream>
using namespace std;
int n;//点的个数
int start,last;//表示起点和终点
const int N = 1010;
int st[N], path[N];//st[N]表示是否遍历过该点,path[N]存储路径
int g[N][N];//存地图
void dfs(int u, int t)
{
//将点存入路径中
path[t] = u;
//如果这个点是终点,输出路径
if(u == last){
for(int i = 0; i < t; i++){
cout<<path[i];
}
cout<<last<<endl;
return;
}
//遍历过的点修改st为1
st[u] = 1;
//如果下个点没有遍历过且与该点连通,继续遍历
for(int i = 0; i < n; i++){
if(st[i] == 0&&g[u][i]==1) dfs(i, t + 1);
}
//回溯过程再次修改为0
st[u] = 0;
}
int main()
{
cin>>n;
cin>>start>>last;
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++){
cin>>g[i][j];
}
}
//从起点开始遍历, 0表示第一次
dfs(start, 0);
return 0;
}