您的位置:首页 > 其它

图结构练习——BFS——从起始点到目标点的最短步数

2016-08-16 09:50 218 查看


图结构练习——BFS——从起始点到目标点的最短步数



Time Limit: 1000MS Memory limit: 65536K

题目描述

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

输入

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

输出

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

示例输入

2 1
1 2
2 1
2 1


示例输出

NO
1


提示

 

来源

 赵利强

示例程序

 

提交 
状态

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1100
typedef int Status;
typedef struct
{
int arcs[MAX][MAX];
int step[MAX];
int vexnum,arcnum;
}MGraph;
Status visited[MAX],begin,top,flag,n,m;
typedef struct QNode
{
int data;
struct QNode *next;
}QNode,*QueuePtr;
typedef struct
{
QueuePtr front;
QueuePtr rear;
}LinkQueue;
Status InitQueue(LinkQueue *Q)
{
Q->front=Q->rear=(QueuePtr)malloc(sizeof(QNode));
if(!Q->front)exit(-1);
Q->front->next=NULL;
return 1;
}
Status EnQueue(LinkQueue *Q,int e)
{
QueuePtr p;
p=(QueuePtr)malloc(sizeof(QNode));
if(!p)exit(-1);
p->data=e;p->next=NULL;
Q->rear->next=p;
Q->rear=p;
return 1;
}
Status QueueEmpty(LinkQueue *Q)
{
if(Q->front==Q->rear)
return 1;
else return 0;
}
Status DeQueue(LinkQueue *Q)
{
QueuePtr p;
if(Q->front==Q->rear)return 0;
p=Q->front->next;
top=p->data;
Q->front->next=p->next;
if(Q->rear==p)Q->rear=Q->front;
free(p);
return 1;
}
Status CreatUDG(MGraph *G)
{
int i,j,k,v1,v2;
G->vexnum=n;G->arcnum=m;
for(i=1;i<=G->vexnum;i++)
for(j=1;j<=G->vexnum;j++)
G->arcs[i][j]=0;
for(i=1;i<=G->vexnum;i++)
G->step[i]=1;
for(k=1;k<=G->arcnum;k++)
{
scanf("%d%d",&v1,&v2);
G->arcs[v1][v2]=1;
}
return 1;
}
int visiT(int v)
{
if(v==1)
flag=1;
return 1;
}
void BFSTraverse(MGraph *G,Status(*Visit)(int v))
{
int v,w;
LinkQueue Q;
for(v=1;v<=G->vexnum;v++)
visited[v]=0;
InitQueue(&Q);
v=G->vexnum;
G->step[v]=0;
if(!visited[v])
{
visited[v]=1;
Visit(v);
EnQueue(&Q,v);
while(!QueueEmpty(&Q))
{
DeQueue(&Q);
for(w=0;w<G->vexnum;w++)
if(!visited[w]&&G->arcs[top][w]==1&&flag==0)
{
visited[w]=1;
G->step[w]+=G->step[top];
Visit(w);
EnQueue(&Q,w);
}
}
}
}
int main()
{
MGraph G;
while(scanf("%d%d",&n,&m)!=EOF)
{
flag=0;
memset(visited,0,sizeof(visited));
CreatUDG(&G);
BFSTraverse(&G,visiT);
if(flag)printf("%d\n",G.step[1]);
else printf("NO\n");
}
return 0;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐