判定图的两点是否有路

问题描述

给定一个有向图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");
    }
}

 

posted @ 2018-12-03 10:51  阳离子  阅读(376)  评论(0编辑  收藏  举报