搜索+剪枝——运筹帷幄 (road.cpp)
运筹帷幄
(road.cpp)
【题目描述】
刘邦军行至迷糊林,见其中瘴气围绕,又有青狼猛虎之兽,难于前行。
已知迷糊林是一个共有n个结点的图,点与点之间共有m条道路相连接,每条路有参数t,c,分别表示行走于该路的时间以及兵士损失量。你已知道,刘邦除了脸皮厚什么都不会而且兵力少得可怜,所以需要在还能有兵士存活的情况下尽快走出迷糊林。
刘邦踞鞍而问曰:“子房,如之奈何?”。
【文件格式】
输入文件:第一行两个整数n,m,表示节点数以及边数。
以下m行每行4个整数u,v,c,t,表示u点以及v点之间有一条参数为c,t的边,c为兵士损失量,t为耗费时间。
第m+2行有两个整数s,t,表示起点与终点。
第m+3行有一个整数k,表示刘邦军的兵力。
输出文件:
一个整数表示能走出迷糊林的最短时间,如果不能走出请输出-1。
【样例数据】
Input(road.in)4 51 2 2 31 3 3 51 4 7 102 4 4 63 4 2 61 45Output (road.out)
11【数据约定】
n<=5000 ,m<=40000 , c,d<=300 , k<=10^9
[Hint]
本题数据随机生成。
【题目思路】
这个题主要是搜索,bfs,不过要是只用单纯的搜索的话绝对会超时,超的不止一点。。。。。所以我用了两种剪枝,第一是先spfa一遍图,算出每个点到终点的最短距离,如果当前搜到的点+这个点到终点的最短距离(士兵数)<拥有的士兵总量,直接过;第二是如果时间超过了当前存储的最小时间(迷糊林路的长度),直接过。
下面上代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue> using namespace std; const int N = 40000+10; struct Edge { int v,b,t,next;
}e[N*2];
int en=0,front[N]; int m,n,u,v,b,t;
int qi,zhong;
int liu;
int d[40001]; void adde(int u,int v,int b,int t) {
en++; e[en].v=v , e[en].b=b , e[en].t=t , e[en].next=front[u];
front[u]=en;
} void spfa() {
queue<int> q;
bool inq[40001];
memset(inq,0,sizeof(inq));
for(int i=1;i<=m;i++) d[i]=1e9+1e9;
d[zhong]=0;inq[zhong]=1; q.push(zhong);
while(!q.empty())
{
int u=q.front(); q.pop(); inq[u]=false;
for(int i=front[u];i;i=e[i].next) {
Edge es=e[i];
int v=es.v;
if(d[v]>d[u]+es.b) {
d[v]=d[u]+es.b;
if(!inq[v])
q.push(v) , inq[v]=1;
}
}
}
} bool dg[5001];
int bd=0,bt=0;
int small=1e9; void dfs(int u,int blood,int dist)
{
if(u==zhong) { small=dist; return; }
for(int i=front[u];i;i=e[i].next) {
Edge es=e[i];
if(!dg[es.v] && blood-es.b > d[es.v] && dist + es.t < small) {
dg[es.v]=1;
dfs(es.v,blood-es.b,dist+es.t);
dg[es.v]=0;
}
}
}
void read(int& x) {
char c=getchar();
while(!isdigit(c)) c=getchar();
x=0;
while(isdigit(c)) {
x=x*10+c-'0';
c=getchar();
}
}
int main()
{
freopen("road.in","r",stdin);
freopen("road.out","w",stdout);
read(m),read(n);
//memset(dg,0,sizeof(dg));
for(int i=1;i<=n;i++)
{
read(u),read(v),read(b),read(t);
adde(u,v,b,t); adde(v,u,b,t);
}
read(qi),read(zhong),read(liu);
spfa();
if(d[qi] > liu)
{
cout<<"-1";
}
else
{
dg[qi]=1;
dfs(qi,liu,0);
cout<<small;
}
return 0;
}数据:http://files.cnblogs.com/files/zhangone/road.zip
(以上代码数据中十个点全过)
感谢李学长在我各种蒟蒻的时候耐心讲解。
搜索+剪枝——运筹帷幄 (road.cpp)的更多相关文章
- NOIP2015 斗地主(搜索+剪枝)
4325: NOIP2015 斗地主 Time Limit: 30 Sec Memory Limit: 1024 MBSubmit: 270 Solved: 192[Submit][Status] ...
- hdu 5469 Antonidas(树的分治+字符串hashOR搜索+剪枝)
题目链接:hdu 5469 Antonidas 题意: 给你一颗树,每个节点有一个字符,现在给你一个字符串S,问你是否能在树上找到两个节点u,v,使得u到v的最短路径构成的字符串恰好为S. 题解: 这 ...
- hdu 5887 搜索+剪枝
Herbs Gathering Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- hdu 5113(2014北京—搜索+剪枝)
题意:有N*M的棋盘,用K种颜色去染,要求相邻块不能同色.已知每种颜色要染的块数,问能不能染,如果能,输出任一种染法. 最开始dfs失败了- -,优先搜索一行,搜完后进入下一列,超时.本来以为搜索不行 ...
- luogu 1731 搜索剪枝好题
搜索剪枝这个东西真的是骗分利器,然鹅我这方面菜的不行,所以搜索数学dp三方面是真的应该好好训练一下 一本通的确该认真的刷嗯 #include<bits/stdc++.h> using na ...
- 搜索+剪枝——POJ 1011 Sticks
搜索+剪枝--POJ 1011 Sticks 博客分类: 算法 非常经典的搜索题目,第一次做还是暑假集训的时候,前天又把它翻了出来 本来是想找点手感的,不想在原先思路的基础上,竟把它做出来了而且还是0 ...
- [HNOI2002]彩票 (搜索+剪枝)
题目描述 某地发行一套彩票.彩票上写有1到M这M个自然数.彩民可以在这M个数中任意选取N个不同的数打圈.每个彩民只能买一张彩票,不同的彩民的彩票上的选择不同. 每次抽奖将抽出两个自然数X和Y.如果某人 ...
- luogu P3393 逃离僵尸岛-搜索剪枝+spfa
P3393 逃离僵尸岛 题目描述 小a住的国家被僵尸侵略了!小a打算逃离到该国唯一的国际空港逃出这个国家. 该国有N个城市,城市之间有道路相连.一共有M条双向道路.保证没有自环和重边. K个城市已经被 ...
- [luogu 1092] 虫食算 (暴力搜索剪枝)
传送门 Description Input 包含四行. 第一行有一个正整数 (N≤26). 后面的三行,每行有一个由大写字母组成的字符串,分别代表两个加数以及和.这3个字符串左右两端都没有空格,从高位 ...
随机推荐
- nodejs实现接收Snmp的Trap消息
var assert = require('assert'); var ASN1 = { EOC: 0, Boolean: 1, Integer: 2, BitString: 3, OctetStri ...
- 网页 php开发中html空文本节点问题user agent stylesheetbody
最近开发中遇到一个奇怪的问题,我的一个网站头部,代码固定不变,放在了不同的模板进行展示,一部分出现了问题,总是距离相差8个像素,用firebug查看发现:meta 跑到 body 下面去了,并且发现了 ...
- DWZ在APS.NET WebForm中的使用(二)
任何框架由于个人理解不到位或者框架自身的局限性,在项目实施中,大家或多或少都会遇到一些问题,下面我就讲述下我在使用DWZ开发过程中的几个问题.如有一点能帮助到你,这篇文章也算有存在的意义了. 1.树菜 ...
- Spring 注入数据源
一.在项目中添加dataSource所用到的包 dbcp数据源所需包: commons-dbcp.jar commons-pool.jar C3P0数据源所需包: c3p0-0 ...
- 封装一些数据库SQLCipher的方法(增、删、改、查)
上一篇随笔只是简单的说了一下使用SQLCipher框架,介绍的比较笼统,可能看一遍之后更加蒙圈了,为了更好的使用这个数据库,整理了我在公司项目的需要用的方法,包括创建表,插入数据,更新数据,搜索查询数 ...
- Java File 类的使用方法详解(转)
转自:http://www.codeceo.com/article/java-file-class.html Java File类的功能非常强大,利用Java基本上可以对文件进行所有的操作.本文将对J ...
- 谈谈对web标准的理解
Web标准不是某一个标准,而是由一系列标准组合而成.网页主要由三部分组成:结构.表现和行为.对应的标准也分三方面:结构化标准语言主要包括XHTML和HTML以及XML,表现标准语言主要包括CSS,行为 ...
- ASP.NET MVC Json() 处理大数据异常解决方法 json MaxJsonLength
网上很多解决方案,在webconfig中添加,但是实践证明无效 <system.web.extensions> <scripting> <webServices> ...
- 在controller间分享数据(第一种办法)
Blood 血腥的方法 每个controller都有自己的scope, 同时也可以共享他们老爸的scope内的数据.如果我们想让两个controller共享数据的化, 有多种方法. 最直接血腥的就是在 ...
- webview的一些问题
一些小问题. Webview 里面的网页,如果有 input ,需要输入,但是点上去却没反应,输入法不出来.这种情况是因为 webview 没有获取焦点.需要在 java 里面给 webview 设置 ...