邻接矩阵存储简单路径(1070)

描述


假设无向图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  } 


原文地址:https://www.cnblogs.com/swust-wangyf/p/6749313.html