hdu2377Bus Pass(构建更复杂的图+spfa)
主题链接:
思路:
题目是给了非常多个车站。然后要你找到一个社区距离这些车站的最大值最小。。所以对每一个车站做一次spfa。那么就得到了到每一个社区的最大值,最后对每一个社区扫描一次,得到那个最小值的社区。。
还有题目要求是要最小的id,所以排一次序。
题目:
Bus Pass
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 667 Accepted Submission(s): 271
Therefore you want to see if it might be advantageous for you to buy a bus pass.
The way the bus system works in your country (and also in the Netherlands) is as follows:
when you buy a bus pass, you have to indicate a center zone and a star value. You are allowed to travel freely in any zone which has a distance to your center zone which is less than your star value. For example, if you have a star value of one, you can only
travel in your center zone. If you have a star value of two, you can also travel in all adjacent zones, et cetera.
You have a list of all bus trips you frequently make, and would like to determine the minimum star value you need to make all these trips using your buss pass. But this is not always an easy task. For example look at the following figure:

Here you want to be able to travel from A to B and from B to D. The best center zone is 7400, for which you only need a star value of 4. Note that you do not even visit this zone on your trips!
One line with two integersnz(2 <=nz<= 9 999) andnr(1 <=nr<= 10): the number of zones and the number of bus trips, respectively.
nz lines starting with two integers idi (1 <= idi <= 9 999) and mzi (1 <= mzi <= 10), a number identifying the i-th zone and the number of zones adjacent to it, followed by mzi integers: the numbers of
the adjacent zones.
nr lines starting with one integer mri (1 <= mri <= 20), indicating the number of zones the ith bus trip visits, followed by mri integers: the numbers of the zones through which the bus passes in the order in which they are
visited.
All zones are connected, either directly or via other zones.
One line with two integers, the minimum star value and the id of a center zone which achieves this minimum star value. If there are multiple possibilities, choose the zone with the lowest number.
1
17 2
7400 6 7401 7402 7403 7404 7405 7406
7401 6 7412 7402 7400 7406 7410 7411
7402 5 7412 7403 7400 7401 7411
7403 6 7413 7414 7404 7400 7402 7412
7404 5 7403 7414 7415 7405 7400
7405 6 7404 7415 7407 7408 7406 7400
7406 7 7400 7405 7407 7408 7409 7410 7401
7407 4 7408 7406 7405 7415
7408 4 7409 7406 7405 7407
7409 3 7410 7406 7408
7410 4 7411 7401 7406 7409
7411 5 7416 7412 7402 7401 7410
7412 6 7416 7411 7401 7402 7403 7413
7413 3 7412 7403 7414
7414 3 7413 7403 7404
7415 3 7404 7405 7407
7416 2 7411 7412
5 7409 7408 7407 7405 7415
6 7415 7404 7414 7413 7412 7416
4 7400
代码为:
#include<cstdio>
#include<queue>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=9999+10;
int dis[maxn],id[maxn],max_dis[maxn];
bool vis[maxn];
vector<int>vec[maxn];
int t,n,bus,cal;
bool cmp(int a,int b)
{
return a<b;
}
void spfa(int st)
{
queue<int>Q;
while(!Q.empty()) Q.pop();
memset(vis,false,sizeof(vis));
memset(dis,INF,sizeof(dis));
Q.push(st);
dis[st]=0;
vis[st]=true;
while(!Q.empty())
{
int temp=Q.front();
Q.pop();
vis[temp]=false;
for(int i=0;i<vec[temp].size();i++)
{
if(dis[temp]+1<dis[vec[temp][i]])
{
dis[vec[temp][i]]=dis[temp]+1;
if(!vis[vec[temp][i]])
{
vis[vec[temp][i]]=true;
Q.push(vec[temp][i]);
}
}
}
}
}
void read_graph()
{
memset(max_dis,0,sizeof(max_dis));
int u;
scanf("%d%d",&n,&bus);
for(int i=1;i<=maxn;i++)
vec[i].clear();
for(int i=1;i<=n;i++)
{
scanf("%d%d",&id[i],&cal);
for(int j=1;j<=cal;j++)
{
scanf("%d",&u);
vec[id[i]].push_back(u);
}
}
while(bus--)
{
scanf("%d",&cal);
while(cal--)
{
int st;
scanf("%d",&st);
spfa(st);
for(int i=1;i<=n;i++)
{
if(dis[id[i]]>max_dis[id[i]])
max_dis[id[i]]=dis[id[i]];
}
}
}
int ans=999999999,ans_id;
sort(id+1,id+1+n,cmp);
for(int i=1;i<=n;i++)
{
if(max_dis[id[i]]<ans)
{
ans=max_dis[id[i]];
ans_id=id[i];
}
}
printf("%d %d\n",ans+1,ans_id);
}
int main()
{
scanf("%d",&t);
while(t--)
{
read_graph();
}
return 0;
}
#include<queue>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#define INF 0x3f3f3f3f
using namespace std; const int maxn=9999+10;
int dis[maxn],id[maxn],max_dis[maxn];
bool vis[maxn];
vector<int>vec[maxn];
int t,n,bus,cal; bool cmp(int a,int b)
{
return a<b;
} void spfa(int st)
{
queue<int>Q;
while(!Q.empty()) Q.pop();
memset(vis,false,sizeof(vis));
memset(dis,INF,sizeof(dis));
Q.push(st);
dis[st]=0;
vis[st]=true;
while(!Q.empty())
{
int temp=Q.front();
Q.pop();
vis[temp]=false;
for(int i=0;i<vec[temp].size();i++)
{
if(dis[temp]+1<dis[vec[temp][i]])
{
dis[vec[temp][i]]=dis[temp]+1;
if(!vis[vec[temp][i]])
{
vis[vec[temp][i]]=true;
Q.push(vec[temp][i]);
}
}
}
}
} void read_graph()
{
memset(max_dis,0,sizeof(max_dis));
int u;
scanf("%d%d",&n,&bus);
for(int i=1;i<=maxn;i++)
vec[i].clear();
for(int i=1;i<=n;i++)
{
scanf("%d%d",&id[i],&cal);
for(int j=1;j<=cal;j++)
{
scanf("%d",&u);
vec[id[i]].push_back(u);
}
}
while(bus--)
{
scanf("%d",&cal);
while(cal--)
{
int st;
scanf("%d",&st);
spfa(st);
for(int i=1;i<=n;i++)
{
if(dis[id[i]]>max_dis[id[i]])
max_dis[id[i]]=dis[id[i]];
}
}
}
int ans=999999999,ans_id;
sort(id+1,id+1+n,cmp);
for(int i=1;i<=n;i++)
{
if(max_dis[id[i]]<ans)
{
ans=max_dis[id[i]];
ans_id=id[i];
}
}
printf("%d %d\n",ans+1,ans_id);
} int main()
{
scanf("%d",&t);
while(t--)
{
read_graph();
}
return 0;
}
版权声明:本文博客原创文章。博客,未经同意,不得转载。
hdu2377Bus Pass(构建更复杂的图+spfa)的更多相关文章
- Stylus-NodeJS下构建更富表现力/动态/健壮的CSS
--------------------------本文来自张鑫旭大神博客------------------------------ 一.为什么我会讲Stylus,而不是SASS和LESS? SAS ...
- Docker多步构建更小的Java镜像
译者按: 最新版Docker将支持多步构建(Multi-stage build),这样使用单个Dockerfile就可以定义多个中间镜像用于构建,测试以及发布等多个步骤,并且有效减小最终镜像的大小. ...
- [BZOJ2963][JLOI2011]飞行路线 分层图+spfa
Description Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并 ...
- 【bzoj2662】[BeiJing wc2012]冻结 分层图Spfa
原文地址:http://www.cnblogs.com/GXZlegend 题目描述 “我要成为魔法少女!” “那么,以灵魂为代价,你希望得到什么?” “我要将有关魔法和奇迹的一切,封印于卡片之中„„ ...
- 使用OpenAPI构建更智能的API
像OpenAPI这样的API描述规范是一个关键工具,您应该尽可能地将其好好掌握,记录和执行API的工作由计算机和开发人员完成:OpenAPI 3.0现在允许额外的表现力,可以让机器为我们做更多有用的工 ...
- Vue.js 学习笔记之六:构建更复杂的组件
在掌握了如何构建与编译 Vue 组件的基础知识之后,接下来就可以试着来构建一些更具有实际用处的复杂组件了.为了赋予组件更具实用性的后面,首先要做的就是让这些组件具备监听用户自定义事件的能力,并且允许用 ...
- Invitation Cards(邻接表+逆向建图+SPFA)
Time Limit: 8000MS Memory Limit: 262144K Total Submissions: 17538 Accepted: 5721 Description In ...
- 使用 jQuery UI 和 jQuery 插件构建更好的 Web 应用程序
简介: 对于那些使用 JavaScript 和 jQuery 库从桌面应用程序转向 Web 应用程序的开发人员来说,他们还不习惯去考虑应用程序基本的外观,因为这些以前都是由操作系统来处理的.了解 jQ ...
- bzoj2763: [JLOI2011]飞行路线(分层图spfa)
2763: [JLOI2011]飞行路线 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3234 Solved: 1235[Submit][Stat ...
随机推荐
- About Unixstickers - Unixstickers - stickers on unix, programming, software, development and open source
About Unixstickers - Unixstickers - stickers on unix, programming, software, development and open so ...
- deque,list,queue,priority_queue
1.deque deque双端队列容器与vector一样,采用线性表顺序存储结构,但与vector唯一不同的是,deque采用分块的线性存储结构来存 储数据,每块的大小一般为512字节,称为一个deq ...
- UIImagePickerController本地化控件文字
在使用UIImagePickerController时候,你会发如今选择照片或者拍照的时候,界面的很多控件都是英文的,比方"Cancel","Choose"等. ...
- 【大话QT之十七】Jenkins介绍及安装使用文档(与Git集成)
文章文件夹结构例如以下: 1> Jenkins与Git相关介绍 2> Jenkins部署安装 3> Gitblit部署安装 4> Jenkins与Git集成使用 5> 项 ...
- python语言学习8——字符串和编码
Unicode编码 计算机只能处理数字,如果要处理文本,就必须把文本转化为数字才能处理 有许多编码标准,但是不同的编码标准有时候会混乱,所以Unicode应运而生 Unicode把所有语言统一到一套编 ...
- 为什么国外程序员爱用苹果Mac电脑?(转)
Mac 在国外很受欢迎,尤其是在 设计/web开发/IT 人员圈子里.普通用户喜欢 Mac 可以理解,毕竟 Mac 设计美观,简单好用,没有病毒.那么为什么专业人士也对 Mac 情有独钟呢?从个人使用 ...
- bzoj1497(最小割)
传送门:最大获利 题意:建立n个中转站,每个花费P[i],有m个用户,使用Ai和Bi中转站可获利Ci,问最终建立哪几个中转站使获利最大? 分析:根据最大权闭合图建图,用户群和中转站为带权的点集,用户群 ...
- 008实现一个算法从一个单链表中返回倒数第n个元素(keep it up)
我们维护两个指针, 它们之间的距离为n. 然后.我将这两个指针同步地在这个单链表上移动,保持它们的距离 为n不变. 那么, 当第二个指针指到空时.第一个指针即为所求. #include <ios ...
- 提领NULL指针
通常之中导致程序崩溃的最重要的原因是试图取消引用NULL指针.正如在以前的文章中指出,智能指针RefCountPtr和ScopedPtr它提供了一个诊断的执行时间. 但,并不是所有的指针是所有的对象都 ...
- Android设计模式(二)--策略模式
1.定义: The Strategy Pattern defines a family of algorithms,encapsulates each one,and makes them inter ...