图结构练习——BFSDFS——判断可达性
題目描述
?在古老的魔獸傳說中,有兩個軍團,一個叫天災,一個叫近衛。在他們所在的地域,有n個隘口,編號為1..n,某些隘口之間是有通道連接的。其中近衛軍團在1號隘口,天災軍團在n號隘口。某一天,天災軍團的領袖巫妖王決定派兵攻打近衛軍團,天災軍團的部隊如此龐大,甚至可以填江過河。但是巫妖王不想付出不必要的代價,他想知道在不修建任何通道的前提下,部隊是否可以通過隘口及其相關通道到達近衛軍團展開攻擊。由于n的值比較大(n<=1000),于是巫妖王找到了擅長編程的你 =_=,請你幫他解決這個問題,否則就把你吃掉變成他的魔法。為了拯救自己,趕緊想辦法吧。 ?輸入
?輸入包含多組,每組格式如下。 第一行包含兩個整數n,m(分別代表n個隘口,這些隘口之間有m個通道)。 下面m行每行包含兩個整數a,b;表示從a出發有一條通道到達b隘口(注意:通道是單向的)。輸出
?如果天災軍團可以不修建任何通道就到達1號隘口,那么輸出YES,否則輸出NO。 ?示例輸入
2 1 1 2 2 1 2 1示例輸出
NO YES提示
#include <stdio.h>
#include <stdlib.h>
#include<queue>
using namespace std;
typedef struct arcnode
{
? ? int adj;
} arcnode, adjmatrix[1000][1000];
typedef struct
{
? ? adjmatrix a;
? ? int vn;
? ? int an;
} MG;
int k;//初始點
int i, j;
int create(MG &g, int n, int m)//生成鄰接矩陣;
{
? ? int v1, v2;
? ? g.vn = n;
? ? g.an = m;
? ? for(i=1; i<=g.vn; i++)
? ? ? ? for(j=1; j<=g.vn; j++)
? ? ? ? ? ? g.a[i][j].adj = 0;
? ? for(i=1; i<=g.an; i++)
? ? {
? ? ? ? scanf("%d %d", &v1, &v2);
? ? ? ? g.a[v1][v2].adj = 1;
? ? }
? ? return 1;
}
int v[1000];//標記數組
int bfs(MG &g)//廣度優先遍歷;
{
? ? queue<int>q;//放在里面 否則超時
? ? for(i=0; i<=g.vn; i++)//初始化;
? ? ? ? v[i] = 0;
? ? v[g.vn] = 1;//從尾結點遍歷;
? ? q.push(g.vn);
? ? while(!q.empty())
? ? {
? ? ? ? i = q.front();
? ? ? ? q.pop();
? ? ? ? if(i == 1)//到頂點1說明天災軍團能到達1號隘口;
? ? ? ? ? ? return 1;
? ? ? ? for(j=1; j<=g.vn; j++)
? ? ? ? {
? ? ? ? ? ? if(g.a[i][j].adj == 1 && !v[j])
? ? ? ? ? ? {
? ? ? ? ? ? ? ? v[j] = 1;
? ? ? ? ? ? ? ? q.push(j);
? ? ? ? ? ? }
? ? ? ? }
? ? }
? ? return 0;
}
int main()
{
? ? MG g;
? ? int n, m;
? ? while(~scanf("%d %d", &n, &m))//主函數里輸入 否則超時
? ? {
? ? ? ? create(g, n, m);
? ? ? ? bfs(g);
? ? ? ? if(!bfs(g))
? ? ? ? ? ? printf("NO\n");
? ? ? ? else
? ? ? ? ? ? printf("YES\n");
? ? }
? ? return 0;
}
總結
以上是生活随笔為你收集整理的图结构练习——BFSDFS——判断可达性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言实验——数组逆序
- 下一篇: java中的包装流和缓冲流概述