数据结构实验之图论五:从起始点到目标点的最短步数(BFS)

来源:互联网 发布:选择题自动填充软件 编辑:程序博客网 时间:2024/06/05 11:14

数据结构实验之图论五:从起始点到目标点的最短步数(BFS)
Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic
Problem Description

在古老的魔兽传说中,有两个军团,一个叫天灾,一个叫近卫。在他们所在的地域,有n个隘口,编号为1..n,某些隘口之间是有通道连接的。其中近卫军团在1号隘口,天灾军团在n号隘口。某一天,天灾军团的领袖巫妖王决定派兵攻打近卫军团,天灾军团的部队如此庞大,甚至可以填江过河。但是巫妖王不想付出不必要的代价,他想知道在不修建任何通道的前提下,部队是否可以通过隘口及其相关通道到达近卫军团展开攻击;如果可以的话,最少需要经过多少通道。由于n的值比较大(n<=1000),于是巫妖王找到了擅长编程的你 =_=,请你帮他解决这个问题,否则就把你吃掉变成他的魔法。为了拯救自己,赶紧想办法吧。

Input

输入包含多组,每组格式如下。
第一行包含两个整数n,m(分别代表n个隘口,这些隘口之间有m个通道)。
下面m行每行包含两个整数a,b;表示从a出发有一条通道到达b隘口(注意:通道是单向的)。

Output

如果天灾军团可以不修建任何通道就到达1号隘口,那么输出最少经过多少通道,否则输出NO。

Example Input

2 1
1 2
2 1
2 1
Example Output

NO
1
Hint

Author

赵利强

include

include

include

using namespace std;

const int MAX = 1050;
int mmp[MAX][MAX];
int vt[MAX];
typedef struct
{
int d, n;
} dt;

void dfs(int v, int s)
{
int i;
vt[s] = 1;
dt tp;
tp.d = s;
tp.n = 0;
queue

qu;
qu.push(tp);
while (!qu.empty())
{
dt t = qu.front();
qu.pop();
for (i = 1; i <= v; i++)
{
if (!vt[i] && mmp[t.d][i])
{
vt[i] = 1;
dt temp;
temp.d = i;
temp.n = t.n + 1;
qu.push(temp);
if (i == 1)
{
cout << temp.n << endl;
return;
}
}
}
}
cout << “NO” << endl;
}
int main()
{

int v, e;while (cin >> v >> e){    int i;    int va, vb;    memset(mmp, 0, sizeof(mmp));    memset(vt, 0, sizeof(vt));    for (i = 0; i < e; i++)    {        cin >> va >> vb;        mmp[va][vb] = 1;    }    dfs(v, v);}return 0;

}

阅读全文
0 0
原创粉丝点击