UVALive7015(bfs求最短路)

来源:互联网 发布:网络专业课程 编辑:程序博客网 时间:2024/05/21 22:25

https://vjudge.net/contest/181467#problem/D(uvalive7015 点击打开题目链接)

思路:bfs求最短路

分析:二维数组,将可以一次到达的楼层直接做标记(一开始想的是直接把楼层之间的距离作为一个权值,但是自己写不出来。。。),起点作为第一个元素存入队列,遍历存入的所有点,如果两个点之间可以直接到达,并且第二个点到目前为止是第一次到达,或者从第一个点到第二个点,比从其他路径到第二个点更近,就更新到第二个点的距离(或者说时间),最后输入重点对应的时间就好。一遍bfs,会把起点到其他所有可以到达的点的最短距离都求出来,最后输出目标点的就好。
(真心佩服人家清晰的思路。。。)

代码:

#include <iostream>#include <string>#include <cstring>#include <algorithm>#include <cstdio>#include <queue>using namespace std;const int maxn = 150 + 10;int arr[maxn][maxn];int a[maxn],book[maxn];int n,start,ed;queue<int> q;void bfs(){       q.push(start);       book[start] = 0;       while(!q.empty())       {           int tmp = q.front();           q.pop();           for(int i = 0;i < maxn;i++)           {               //tmp和i之间有边,而且i没走过或者经过tmp到i比从其他的途径到i的时间要少               if(arr[tmp][i] && (book[i] == -1 || book[tmp] + abs(tmp - i) < book[i]))               {                   book[i] = book[tmp] + abs(tmp - i);                   q.push(i);               }           }       }}int main(){    while(scanf("%d%d%d",&n,&start,&ed) && (n || start || ed))    {        memset(book,-1,sizeof(book));//不能初始化为0,因为后面可能会出现刚好为0的情况        memset(arr,0,sizeof(arr));        memset(a,0,sizeof(a));        for(int i = 1;i <= n;i++)        {            int m;            //一开始不懂为什么要在这里输入a[0],看了下面的代码后真的佩服人家的思维            scanf("%d%d",&m,&a[0]);            for(int j = 1;j < m;j++)            {                scanf("%d",&a[j]);                arr[a[j]][a[j-1]] = arr[a[j-1]][a[j]] = 1;            }        }        bfs();        printf("%d\n",book[ed]);    }}
  • 一般可以用bfs写的题差不多也可以用dfs写,dfs怎么写还得想想。。。