判定图的两点是否有路
问题描述
给定一个有向图G,以及两个顶点s和t,判定s和t是否存在一条有向路径(s->t)
输入描述
输入文件,包含多组数据,每个测试数据的第一行为两个整数n和m,分别表示图G的顶点数和变数,
接下来有m行,每行为两个整数u,v,描述一条有向边<u,v>,
最后有一行为两个整数,s,t,其中s≠t,且n<=50,且此图为简单图,其基图为连同的。
输入文件的最后一行为0,0,表示输入结束
输出描述
若存在一条s到t的路,则输出yes,否则输出no
样例输入
7 9
1 2
2 3
2 5
2 6
3 5
4 3
5 2
5 4
6 7
3 6
0 0
样例输出
yes
这道题是校赛的一道题,自己早早的做了出来,但是一直提交不过,赛后才发现,自己在处理每组数据之前,忘记清零变量!!
希望自己不要再犯这种错误。
#include <stdio.h> #include <iostream> #include <stdlib.h> #include <stack> using namespace std; int maze[70][70]; int visit[70]; int n, m; int xx, yy; int flag = 0; void dfs() { stack<int>my_stack; my_stack.push(xx); while (!my_stack.empty()) { int t = my_stack.top(); if (t == yy) { flag = 1; return; } my_stack.pop(); for (int i = 1; i <= n; i++) { if (maze[t][i] == 1 && visit[i] == 0) { visit[i] = 1; my_stack.push(i); } } } } int main() { while (cin >> n >> m) { if (n == 0 && m == 0) break; flag = 0; for (int i = 1; i <= n; i++) { visit[i] = 0; for (int j = 1; j <= n; j++) { maze[i][j] = 0; } } int i = 1; while (i <= m) { int x, y; cin >> x >> y; maze[x][y] = 1; i++; } cin >> xx >> yy; visit[xx] = 1; dfs(); if (flag == 1) printf("yes\n"); else printf("no\n"); } }