#include <stdio.h> #include <string.h> #include <stdlib.h> #define maxn 10086 int num[maxn]; //记录到n结点的最短距离 int Map[maxn][maxn]; //记录结点的连通性 int vis[maxn]; //记录是否已遍历过改结点 int Now[maxn]; //储存已遍历的结点 int n,m,i; int BFS(int k) { memset(vis,0,sizeof(vis)); memset(Now,0,sizeof(Now)); memset(num,1061109567,sizeof(num)); int ss = 0,ee =0; Now[ss++] = k;//保存头结点 vis[k] = 1; //标记当前结点已经被访问过 num[k] = 0; //初始化为0 while(ss>ee) { int now = Now[ee++]; //得到队列的首元素 for(i=n;i>=1;i--) { if(Map[now][i]==1 && vis[i]==0) //当前结点与i结点连通 && 没有遍历过 { Now[ss++] = i; //将i结点存入队列 vis[i] = 1; //标记遍历过 num[i] = num[i]<num[now]?num[i]:num[now]+1; //若i节点此前到n节点的距离<当前节点到n节点的距离,num[i]不变; } //否则,i节点到n节点的距离 = num[now]+1; } } if(num[1]==1061109567) printf("NO\n"); else printf("%d\n",num[1]); } int main() { int u,v; while(~scanf("%d %d",&n,&m)) { memset(Map,0,sizeof(Map)); for(i=0;i<m;i++) { scanf("%d %d",&u,&v); Map[u][v]=1; } BFS(n);//从n开始查找; } return 0; }
转载于:https://www.cnblogs.com/CCCrunner/p/6444581.html