运筹帷幄

(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 5
1 2 2 3
1 3 3 5
1 4 7 10
2 4 4 6
3 4 2 6
1 4
5

Output (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)的更多相关文章

  1. NOIP2015 斗地主(搜索+剪枝)

    4325: NOIP2015 斗地主 Time Limit: 30 Sec  Memory Limit: 1024 MBSubmit: 270  Solved: 192[Submit][Status] ...

  2. hdu 5469 Antonidas(树的分治+字符串hashOR搜索+剪枝)

    题目链接:hdu 5469 Antonidas 题意: 给你一颗树,每个节点有一个字符,现在给你一个字符串S,问你是否能在树上找到两个节点u,v,使得u到v的最短路径构成的字符串恰好为S. 题解: 这 ...

  3. hdu 5887 搜索+剪枝

    Herbs Gathering Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  4. hdu 5113(2014北京—搜索+剪枝)

    题意:有N*M的棋盘,用K种颜色去染,要求相邻块不能同色.已知每种颜色要染的块数,问能不能染,如果能,输出任一种染法. 最开始dfs失败了- -,优先搜索一行,搜完后进入下一列,超时.本来以为搜索不行 ...

  5. luogu 1731 搜索剪枝好题

    搜索剪枝这个东西真的是骗分利器,然鹅我这方面菜的不行,所以搜索数学dp三方面是真的应该好好训练一下 一本通的确该认真的刷嗯 #include<bits/stdc++.h> using na ...

  6. 搜索+剪枝——POJ 1011 Sticks

    搜索+剪枝--POJ 1011 Sticks 博客分类: 算法 非常经典的搜索题目,第一次做还是暑假集训的时候,前天又把它翻了出来 本来是想找点手感的,不想在原先思路的基础上,竟把它做出来了而且还是0 ...

  7. [HNOI2002]彩票 (搜索+剪枝)

    题目描述 某地发行一套彩票.彩票上写有1到M这M个自然数.彩民可以在这M个数中任意选取N个不同的数打圈.每个彩民只能买一张彩票,不同的彩民的彩票上的选择不同. 每次抽奖将抽出两个自然数X和Y.如果某人 ...

  8. luogu P3393 逃离僵尸岛-搜索剪枝+spfa

    P3393 逃离僵尸岛 题目描述 小a住的国家被僵尸侵略了!小a打算逃离到该国唯一的国际空港逃出这个国家. 该国有N个城市,城市之间有道路相连.一共有M条双向道路.保证没有自环和重边. K个城市已经被 ...

  9. [luogu 1092] 虫食算 (暴力搜索剪枝)

    传送门 Description Input 包含四行. 第一行有一个正整数 (N≤26). 后面的三行,每行有一个由大写字母组成的字符串,分别代表两个加数以及和.这3个字符串左右两端都没有空格,从高位 ...

随机推荐

  1. windows笔记

    三星(SAMSUNG)905S3G-K07 安装Windows 7 过程分享 http://www.cnblogs.com/scue/p/4100743.html 打开方式没有excel http:/ ...

  2. Convert Sorted List to Binary Search Tree java

    public TreeNode sortedListToBST(ListNode head) { if(head==null) return new TreeNode(0); ArrayList< ...

  3. 认证和注册,提交到App Store:

    账号分为个人和公司个人付费后2天左右,收到激活邮件,可以使用 member center certificates,identifiers&profiles:certificates 认证:d ...

  4. [Linked List]Copy List with Random Pointer

    Total Accepted: 53943 Total Submissions: 209664 Difficulty: Hard A linked list is given such that ea ...

  5. Mysql优化之创建高性能索引(一)

    1.索引基础 索引对于良好的性能非常关键.尤其是当表中的数据量越来越大时,索引对性能的影响愈发重要.但是不恰当的索引随着数据量的增加,也会使整个数据库的性能下降. 举个例子: ; 如果在id上建立索引 ...

  6. Android 6.0权限问题

    Android 6.0 open failed: EACCES (Permission denied) 对于6.0+权限问题,报错如上: 解决方案: Android 6.0 (Marshmallow) ...

  7. #event.initMouseEvent

    initMouseEvent 方法用于初始化通过 DocumentEvent 接口创建的 MouseEvent 的值.此方法只能在通过 dispatchEvent 方法指派 MouseEvent 之前 ...

  8. SQL Server 错误18456

    第一步. 错误发生的场景 第二步. 找到引起错误的原因 第1步. 查看windows日志文件. 运行中输入 eventvwr (event viewer)打开日志文件查看器, 第三步. 解决方案,由第 ...

  9. SSAS父子层次结构的增强-UnaryOperatorColumn属性

    上次我有讲到自定义汇总,这次的内容跟上次的差不多也算是自定义汇总,实现的方式不同而已!使用的是UnaryOperatorColumn属性. 这个属性说明: 一元运算符用于将成员自定义汇总到父级,汇总运 ...

  10. git 的一些使用和命令

    http://git.oschina.net/progit/2-Git-%E5%9F%BA%E7%A1%80.html(pro git)   git branch  (展示本地当前的所有分支,以及当前 ...