当前位置: 首页 > news >正文

(BFS)hdoj2377-Bus Pass

题目地址

因为最后要看的是到所有路线上的区域最大距离最小的中心点,所以可以采取遍历路线上所有的区域,对每个区域进行BFS的办法。为了更方便的在每一次BFS都遍历所有的区域,可以加一个reach数组,记录每个区域被第几站BFS过,进行过一次就将站数赋给reach。BFS时的“距离”类似于”“等距线”,一圈圈的往外面走。

 1 #include <cstdio>
 2 #include <queue>
 3 #include<cstring>
 4 #define ZMAX 10000//定义整个地区编号的最大值
 5 #define INF 100000
 6 using namespace std;
 7 int nz,nr;//number of zones地区数,number of routes路线数
 8 int mz[ZMAX];//存储第i个区域相邻的区域数
 9 int Edge[ZMAX][10];//第i个区域相邻的区域的编号
10 int res[ZMAX];//该区域到所有路线上的区域的距离的最小值
11 int cur;//“第几站”,用以界定路线上的区域,每次刷新其他区域的res的值
12 int reach[ZMAX];//记录某个区域res已经刷新到了路线上第几个区域,e.g. reach[s]==cur 表示地区s在第cur+1站已访问
13 int max(int x,int y)
14 {
15     return (x>y)?x:y;
16 }
17 void BFS(int s)//从区域s出发的BFS遍历
18 {
19     int i,a,b;
20     int val,at;//val记录层(圈)数(即“等距线”的第几层,或者说是距离),at表示当前节点
21     queue<int> q[2];//滚动队列
22     a=0,b=1,val=0;
23     if(reach[s]<cur)//这种情况表示这一站还没刷新过s这个位置
24     {
25         q[b].push(s);
26         reach[s]=cur;
27         res[s]=max(res[s],val+1);//层数是需要+1的,这样才为需要的值
28     }
29     while(!q[b].empty())
30     {
31         swap(a,b);//开始交换a、b,滚动
32         val++;//层数+1,因为之前那层的已经全部放入队列中
33         while(!q[a].empty())
34         {
35             at=q[a].front();
36             q[a].pop();
37             for(i=0;i<mz[at];i++)
38             {
39                 if(reach[Edge[at][i]]<cur)//看这个的临近区域,未刷新就放入队列
40                 {
41                     q[b].push(Edge[at][i]);
42                     reach[Edge[at][i]]=cur;
43                     res[Edge[at][i]]=max(res[Edge[at][i]],val+1);//进行刷新
44                 }
45             }
46         }
47     }
48 }
49 int main()
50 {
51     int T;
52     int i,j,t;
53     int id;
54     int mr;//公交线路途径区域数
55     int ret,center;//记录最小星形阈值和中心地区编号
56     scanf("%d",&T);
57     for(t=0;t<T;t++)
58     {
59         memset(reach,-1,sizeof(reach));//reach要初始化为1,因为cur初始为0
60         memset(res,0,sizeof(res));
61         cur=0;
62         scanf("%d%d",&nz,&nr);
63         for(i=0;i<nz;i++)
64         {
65             scanf("%d",&id);
66             scanf("%d",&mz[id]);
67             for(j=0;j<mz[id];j++)
68                 scanf("%d",&Edge[id][j]);
69         }
70         for(i=0;i<nr;i++)
71         {
72             scanf("%d",&mr);
73             for(j=0;j<mr;j++)
74             {
75                 scanf("%d",&id);
76                 BFS(id);//对公交线路上的每个区域分别进行DFS,刷新其他所有区域的res
77                 cur++;//下一站
78             }
79         }
80         ret=10000000,center=-1;
81         for(i=0;i<10000;i++)
82         {
83             if(reach[i]==cur-1&&res[i]<ret)//第一条判断是否经过了最后一次的刷新
84             {
85                 ret=res[i];
86                 center=i;
87             }
88         }
89         printf("%d %d\n",ret,center);
90     }
91     return 0;
92 }

 

转载于:https://www.cnblogs.com/quintessence/p/6032837.html

相关文章:

  • 最少交换次数
  • 团队作业三之问题解答
  • srand()、rand()、time()函数的用法
  • 更改pip源至国内镜像,显著提升下载速度(转载)
  • 如何用distinct消除重复记录的同时又能选取多个字段值?
  • JavaScript之继承(原型链)
  • 21、JavaScript加强
  • linux uart驱动——相关数据结构以及API(二)
  • 放课后的约定
  • Matlab Tricks(二十)—— Hilbert matrix 的创建
  • php面向对象
  • require.js与sea.js的区别
  • 11-13
  • Discuz! 6.x/7.x 全局变量防御绕过导致命令执行
  • 各类应用的简称
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • Brief introduction of how to 'Call, Apply and Bind'
  • CSS盒模型深入
  • DataBase in Android
  • Django 博客开发教程 16 - 统计文章阅读量
  • js中forEach回调同异步问题
  • VUE es6技巧写法(持续更新中~~~)
  • webpack项目中使用grunt监听文件变动自动打包编译
  • 不上全站https的网站你们就等着被恶心死吧
  • 反思总结然后整装待发
  • 给Prometheus造假数据的方法
  • 悄悄地说一个bug
  • 一道面试题引发的“血案”
  • 一个SAP顾问在美国的这些年
  • 自定义函数
  • 自动记录MySQL慢查询快照脚本
  • ionic异常记录
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (四)库存超卖案例实战——优化redis分布式锁
  • (转)Unity3DUnity3D在android下调试
  • (转载)从 Java 代码到 Java 堆
  • .NET 8.0 中有哪些新的变化?
  • .NET Core中的去虚
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • @media screen 针对不同移动设备
  • [ C++ ] STL---string类的使用指南
  • [ SNOI 2013 ] Quare
  • [BZOJ] 2006: [NOI2010]超级钢琴
  • [IE技巧] 如何关闭Windows Server版IE的安全限制
  • [ISCTF 2023]——Web、Misc较全详细Writeup、Re、Crypto部分Writeup
  • [Java算法分析与设计]--线性结构与顺序表(List)的实现应用
  • [JS]变量
  • [leetcode]_Symmetric Tree
  • [NOIP2018 PJ T4]对称二叉树
  • [Python人工智能] 四十四.命名实体识别 (5)利用bert4keras构建Bert-CRF实体识别模型(实体位置)
  • [Wap]OnViewStateExpire异常的处理办法
  • [zt]提问的艺术