描述
假设无向图G采用邻接矩阵存储,设计一个算法,输出图G中从顶点u到v的所有简单路径。
input
简单路径是指路径上的顶点不重复。第一行为一个整数n,表示顶点的个数(顶点编号为0到n-1),第二行表示顶点u和v的编号,接下来是为一个n*n大小的矩阵,表示图的邻接关系。数字为0表示不邻接,1表示不邻接。
output
输出图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
这道题我用的是深度优先搜索,用一个数组来存储经过的节点,并在遍历到节点是先标记为已遍历,遍历到目标节点时立即用数组进行输出,之后等一次路径输出后立即将标记改为为遍历,具体代码如下:
1 #include<iostream> 2 #include<algorithm> 3 #include<vector> 4 #include<string.h> 5 using namespace std; 6 7 #define maxsize 1000 8 9 vector<int>map[maxsize]; 10 int p[maxsize]; 11 int vis[maxsize]; 12 int start,end; 13 int n; 14 15 void init() 16 { 17 memset(p,0,sizeof(p)); 18 memset(vis,0,sizeof(vis)); 19 for(int i=0;i<n;i++)map[i].clear(); 20 cin>>n>>start>>end; 21 int num; 22 for(int i=0;i<n;i++) 23 for(int j=0;j<n;j++) 24 { 25 cin>>num; 26 if(num!=0) 27 map[i].push_back(j); 28 } 29 30 } 31 32 void print(int u) 33 { 34 for(int i=0;i<=u;i++) 35 { 36 cout<<p[i]; 37 } 38 cout<<endl; 39 } 40 41 void dfs(int u,int t) 42 { 43 p[t]=u; 44 if(u==end) 45 { 46 print(t); 47 return; 48 } 49 50 vis[u]=1; 51 for(int i=0;i<map[u].size();i++) 52 { 53 int v=map[u][i]; 54 if(vis[v]==0)dfs(v,t+1); 55 } 56 vis[u]=0; 57 } 58 59 int main() 60 { 61 init(); 62 dfs(start,0); 63 return 0; 64 }