深度优先搜索/广度优先搜索顶点之间的路径(邻接表)
2016-03-25 22:34
453 查看
[align=left]描述[/align]
给出一个有向图(节点个数<=100),试利用邻接表方式存储,然后利用图的深度优先搜索,判断是否存在由顶点vi到顶点vj的路径(i != j)。注意:有多条路径需要判断,每个结果占一行,最后要输出一个回车符。
[align=left]输入[/align]
从1开始表示第一个节点。
第一行输入: 有向图的边数n,测例的个数m。
之后n行输入:用来描述边,如2 4表示存在一条由顶点2到4的边。
之后是m行输入:用来给出要测的路径,如2 5表示是否存在由顶点2到顶点5的路径。
[align=left]输出[/align]
对于每个测试例子输出一个结果并占一行。
输出 Y表示源点和终点之间没有路径
输出 N表示源点和终点之间存在路径
[align=left]输入样例[/align]
3 2
1 2
2 3
4 3
1 4
1 3
[align=left]输出样例[/align]
N
Y
给出一个有向图(节点个数<=100),试利用邻接表方式存储,然后利用图的深度优先搜索,判断是否存在由顶点vi到顶点vj的路径(i != j)。注意:有多条路径需要判断,每个结果占一行,最后要输出一个回车符。
[align=left]输入[/align]
从1开始表示第一个节点。
第一行输入: 有向图的边数n,测例的个数m。
之后n行输入:用来描述边,如2 4表示存在一条由顶点2到4的边。
之后是m行输入:用来给出要测的路径,如2 5表示是否存在由顶点2到顶点5的路径。
[align=left]输出[/align]
对于每个测试例子输出一个结果并占一行。
输出 Y表示源点和终点之间没有路径
输出 N表示源点和终点之间存在路径
[align=left]输入样例[/align]
3 2
1 2
2 3
4 3
1 4
1 3
[align=left]输出样例[/align]
N
Y
#include <iostream> #include <algorithm> #include <cstring> #define maxnum 120 using namespace std; typedef char VertexType; //边 typedef struct ArcNode { int adjvex; struct ArcNode *nextarc; }ArcNode; //顶点 typedef struct VNode { VertexType data; ArcNode *firstarc; }VNode, AdjList[maxnum]; typedef struct { AdjList vertices;//数组 int vexnum, arcnum; }ALGraph; int visited[maxnum] = {0}; void CreateALGraph(ALGraph &g, int arc, int vex) { g.arcnum = arc; g.vexnum = vex; int v1, v2, i; for(i = 1; i <= vex; i++) { g.vertices[i].firstarc = NULL; } for(i = 1; i <= arc; i++) { cin >> v1 >> v2; ArcNode *q = (ArcNode*)malloc(sizeof(ArcNode)); q->adjvex = v2; q->nextarc = g.vertices[v1].firstarc; g.vertices[v1].firstarc = q; } } int DFS(ALGraph g, int i, int j) { visited[i] = 1; ArcNode *p = g.vertices[i].firstarc; while(p) { if(p->adjvex == j) return 1; //cout <<(visited[p->adjvex])<< endl; if(!(visited[p->adjvex]) && DFS(g, p->adjvex, j)) return 1; p = p->nextarc; } return 0; } int main() { int m, n; cin >> m >> n; ALGraph g; CreateALGraph(g, m, m+1); // for(int i = 1; i <= m+1; i++) // { // ArcNode *p = g.vertices[i].firstarc; // cout << "i = " << i << ": "; // while(p) // { // cout << p->adjvex; // p = p->nextarc; // } // cout << endl; // } while(n--) { int v1, v2; cin >> v1 >> v2; memset(visited, '\0', sizeof(visited));//错误找了好久 int flag = DFS(g, v1, v2); if(flag) cout << "Y" << endl; else cout << "N" << endl; } return 0; }
相关文章推荐
- 使用ssh-keygen和ssh-copy-id三步实现SSH无密码登录
- tomcat多例
- mipi调试经验
- session、cookie、viewstate
- (三)JavaScript之[事件]与[字符串]
- 第12课 注释符号
- leetcode 133. Clone Graph
- 大数相乘,结果在2000位以内
- PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
- ORACLE多表关联UPDATE 语句
- Java 输出流中的flush方法
- OD使用心得
- asp.net 基礎部分一
- Linux中mv重命名作用及打包war压缩文件及分配权限
- flask-sqlalchemy(1)
- websphere中解决一个NoClassFoundException问题
- 用迪杰斯特拉算法求赋权图中的最短路径
- 一种文库类网站建设思路.md
- Spring_Q_collect
- svn的merge使用例子