hihocoder 1139 二分答案+BFS求最短路
2016-07-24 21:35
274 查看
间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
在上一回和上上回里我们知道Nettle在玩《艦これ》,Nettle在整理好舰队之后终于准备出海捞船和敌军交战了。
在这个游戏里面,海域是N个战略点(编号1..N)组成,如下图所示
map.png
其中红色的点表示有敌人驻扎,猫头像的的点表示该地图敌军主力舰队(boss)的驻扎点,虚线表示各个战略点之间的航线(无向边)。
在游戏中要从一个战略点到相邻战略点需要满足一定的条件,即需要舰队的索敌值大于等于这两点之间航线的索敌值需求。
由于提高索敌值需要将攻击机、轰炸机换成侦察机,舰队索敌值越高,也就意味着舰队的战力越低。
另外在每一个战略点会发生一次战斗,需要消耗1/K的燃料和子弹。必须在燃料和子弹未用完的情况下进入boss点才能与boss进行战斗,所以舰队最多只能走过K条航路。
现在Nettle想要以最高的战力来进攻boss点,所以他希望能够找出一条从起始点(编号为1的点)到boss点的航路,使得舰队需要达到的索敌值最低,并且有剩余的燃料和子弹。
特别说明:两个战略点之间可能不止一条航线,两个相邻战略点之间可能不止一条航线。保证至少存在一条路径能在燃料子弹用完前到达boss点。
提示:你在找什么?
输入
第1行:4个整数N,M,K,T。N表示战略点数量,M表示航线数量,K表示最多能经过的航路,T表示boss点编号, 1≤N,K≤10,000, N≤M≤100,000
第2..M+1行:3个整数u,v,w,表示战略点u,v之间存在航路,w表示该航路需求的索敌值,1≤w≤1,000,000。
输出
第1行:一个整数,表示舰队需要的最小索敌值。
样例输入
5 6 2 5
1 2 3
1 3 2
1 4 4
2 5 2
3 5 5
4 5 3
样例输出
3
思路:
这里判断能不能用m的索敌值到达用的是BFS,然后就是二分找答案
.二分枚举,设定枚举区间[L,R],满足f(L)=false, f(R)=true。每次取中间值Mid=(L+R)/2,若f(Mid)=true,令R=Mid;否则令L=Mid。
当L+1=R时,可以知道R即为我们需要寻找的答案。
然后这里构造地图用的是邻接表。需要注意的是在往队列中压入节点的时候w不能大于m。最后BFS要加个return 0,因为这是这是没找到情况才会一直到队列为空的。
单点时限:1000ms
内存限制:256MB
描述
在上一回和上上回里我们知道Nettle在玩《艦これ》,Nettle在整理好舰队之后终于准备出海捞船和敌军交战了。
在这个游戏里面,海域是N个战略点(编号1..N)组成,如下图所示
map.png
其中红色的点表示有敌人驻扎,猫头像的的点表示该地图敌军主力舰队(boss)的驻扎点,虚线表示各个战略点之间的航线(无向边)。
在游戏中要从一个战略点到相邻战略点需要满足一定的条件,即需要舰队的索敌值大于等于这两点之间航线的索敌值需求。
由于提高索敌值需要将攻击机、轰炸机换成侦察机,舰队索敌值越高,也就意味着舰队的战力越低。
另外在每一个战略点会发生一次战斗,需要消耗1/K的燃料和子弹。必须在燃料和子弹未用完的情况下进入boss点才能与boss进行战斗,所以舰队最多只能走过K条航路。
现在Nettle想要以最高的战力来进攻boss点,所以他希望能够找出一条从起始点(编号为1的点)到boss点的航路,使得舰队需要达到的索敌值最低,并且有剩余的燃料和子弹。
特别说明:两个战略点之间可能不止一条航线,两个相邻战略点之间可能不止一条航线。保证至少存在一条路径能在燃料子弹用完前到达boss点。
提示:你在找什么?
输入
第1行:4个整数N,M,K,T。N表示战略点数量,M表示航线数量,K表示最多能经过的航路,T表示boss点编号, 1≤N,K≤10,000, N≤M≤100,000
第2..M+1行:3个整数u,v,w,表示战略点u,v之间存在航路,w表示该航路需求的索敌值,1≤w≤1,000,000。
输出
第1行:一个整数,表示舰队需要的最小索敌值。
样例输入
5 6 2 5
1 2 3
1 3 2
1 4 4
2 5 2
3 5 5
4 5 3
样例输出
3
思路:
这里判断能不能用m的索敌值到达用的是BFS,然后就是二分找答案
.二分枚举,设定枚举区间[L,R],满足f(L)=false, f(R)=true。每次取中间值Mid=(L+R)/2,若f(Mid)=true,令R=Mid;否则令L=Mid。
当L+1=R时,可以知道R即为我们需要寻找的答案。
然后这里构造地图用的是邻接表。需要注意的是在往队列中压入节点的时候w不能大于m。最后BFS要加个return 0,因为这是这是没找到情况才会一直到队列为空的。
hljs cpp">#include<cstdio> #include<iostream> #include<cmath> #include<algorithm> #include<queue> #include<vector> using namespace std; #define LL long long #define INF 0x3f3f3f3f const int MAXN=10005; int N,M,K,T; struct node1{ int to,w; node1(int _to,int _w):to(_to),w(_w){} }; struct node2{ int p,d; node2(int _p,int _d):p(_p),d(_d){} }; bool vis[MAXN]; vector<node1>V[MAXN]; int BFS(int m){ memset(vis,0,sizeof(vis)); queue<node2>Q; Q.push(node2(1,0)); while(!Q.empty()){ node2 t=Q.front(); Q.pop(); int n=t.p,dd=t.d; if(dd>K)return 0; if(n==T)return 1; vis =1; for(int i=0;i<V .size();i++){ if(V [i].w>m||vis[V [i].to])continue; Q.push(node2(V [i].to,dd+1)); } } return 0; } int main(){ int u,v,w; scanf("%d%d%d%d",&N,&M,&K,&T); while(M--){ scanf("%d%d%d",&u,&v,&w); V[u].push_back(node1(v,w)); V[v].push_back(node1(u,w)); } int l=0,r=1000000; int m; while(l+1<r){ m=(l+r)>>1; if(BFS(m))r=m; else l=m; } cout<<r<<endl; return 0; }
相关文章推荐
- 【ASP.NET】——Web服务器控件、HTML服务器控件
- 萌新的Canvas笔记(一)
- Java学习笔记之反射(Reflection)
- PAT A1046 Shortest Distance (20)
- AIDL
- MyEclipse Database Explorer配置浅析
- androidapp 检测到移动物体,通过web在电脑上实时显示出来
- 在mysql中关于通过多字段去除重复记录的方法
- Spring的注解驱动控制程序
- 测试
- linux服务之tuned
- CTF Field Guide
- git
- 使用Xcode Instruments Leak解决内存泄漏问题
- 【数据库】数据库设计
- HTML——图形标签
- 用俗话讲讲卡尔曼滤波与粒子滤波
- BitmapFactory解析与Bitmap的内存优化
- 如何登录mysql? cmd怎么连接mysql数据库
- 简易使用POI导入导出excel文件