题意:N点M边的无向图,边上有线性不下降的温度,给固定入口S,有E个出口。逃出去,使最大承受温度最小。输出该温度,若该温度超过H,输出-1。

羞涩的题意

显然N*H的复杂度dp[n][h]表示到达n最大温度为h的最小时间(由于温度不下降,这样不会更差,故可以这么搞)

一开始读错题了,以为是温度累加什么鬼...

然后分别写了2种方法,二分和不二分的

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <string>
#include <set>
#include <queue>
using namespace std; #define ll long long
#define MP make_pair #define inf 0x3f3f3f3f
#define eps 1e-8 #define maxn 110
struct edge{
int v,nxt;
int w,r,p;
}e[maxn*maxn*];
int head[maxn], sz;
void init(){sz=;memset(head,-,sizeof(head));}
void addedge(int u,int v,int w,int ri,int pi){
e[sz].v=v,e[sz].nxt=head[u];
e[sz].w=w,e[sz].r=ri,e[sz].p=pi;
head[u]=sz++;
}
int dp[maxn][];
bool ed[maxn];
bool ins[maxn][];
int pre[maxn][][];
int getout;
void dfs(int u,int hp,int S,int cnt){
if(u==S){printf("%d %d",cnt+,u);return ;}
dfs(pre[u][hp][],pre[u][hp][],S,cnt+);
printf(" %d",u);
}
bool check(int mahp, int S){
memset(dp,0x3f,sizeof(dp));
dp[S][] = ;
memset(ins,false,sizeof(ins));
ins[S][] = true;
queue<pair<int,int> >que;
que.push(MP(S,));
if(ed[S]){getout = S;return true;}
while(!que.empty()){
int u = que.front().first;
int hp = que.front().second;
int t = dp[u][hp];
que.pop();
ins[u][hp] = false;
for(int i=head[u];i!=-;i=e[i].nxt){
int v = e[i].v;
int w = e[i].w;
int r = e[i].r;
int p = e[i].p;
ll tmp = r+p*(t+w);
if(tmp>mahp) continue;
int hp2 = max(hp,int(tmp));
if(dp[v][hp2]>dp[u][hp]+w){
pre[v][hp2][] = u;
pre[v][hp2][] = hp;
if(ed[v]){getout = v;return true;}
dp[v][hp2] = dp[u][hp]+w;
if(ins[v][hp2]==false){
ins[v][hp2] = true;
que.push(MP(v,hp2));
}
}
}
}
return false;
}
int main(){
int n,m,H,S,E;
while(~scanf("%d%d%d%d%d",&n,&m,&H,&S,&E)){
memset(ed,false,sizeof(ed));
init();
for(int i=;i<m;++i){
int u,v,w,r,p;
scanf("%d%d%d%d%d",&u,&v,&w,&r,&p);
addedge(u,v,w,r,p);
addedge(v,u,w,r,p);
}
for(int i=;i<E;++i){
int tmp;
scanf("%d",&tmp);
ed[tmp] = true;
}
int l=,r=H+;
while(l<r){
int mid = (l+r)/;
if(check(mid,S)) r = mid;
else l = mid+;
}
if(r<=H){
puts("YES");
printf("%d\n",r);
check(r,S);
dfs(getout,r,S,);
puts("");
}else puts("NO");
}
return ;
}

二分代码

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <vector>
#include <string>
#include <set>
#include <queue>
using namespace std; #define ll long long
#define MP make_pair #define inf 0x3f3f3f3f
#define eps 1e-8 #define maxn 110
struct edge{
int v,nxt;
int w,r,p;
}e[maxn*maxn*];
int head[maxn], sz;
void init(){sz=;memset(head,-,sizeof(head));}
void addedge(int u,int v,int w,int ri,int pi){
e[sz].v=v,e[sz].nxt=head[u];
e[sz].w=w,e[sz].r=ri,e[sz].p=pi;
head[u]=sz++;
}
int dp[maxn][];
bool ed[maxn];
bool ins[maxn][];
int pre[maxn][][];
void dfs(int u,int hp,int S,int cnt){
if(u==S){printf("%d %d",cnt+,u);return ;}
dfs(pre[u][hp][],pre[u][hp][],S,cnt+);
printf(" %d",u);
}
pair<int,int> spfa(int mahp, int S){
int getout=-,ans = mahp+;
memset(dp,0x3f,sizeof(dp));
dp[S][] = ;
memset(ins,false,sizeof(ins));
ins[S][] = true;
queue<pair<int,int> >que;
que.push(MP(S,));
if(ed[S]) return MP(S,);
while(!que.empty()){
int u = que.front().first;
int hp = que.front().second;
int t = dp[u][hp];
que.pop();
ins[u][hp] = false;
if(hp>=ans) continue;
for(int i=head[u];i!=-;i=e[i].nxt){
int v = e[i].v;
int w = e[i].w;
int r = e[i].r;
int p = e[i].p;
ll tmp = r+p*(t+w);
if(tmp>mahp) continue;
int hp2 = max(hp,int(tmp));
if(hp2>=ans) continue;
if(dp[v][hp2]>dp[u][hp]+w){
pre[v][hp2][] = u;
pre[v][hp2][] = hp;
if(ed[v]){
getout = v;
ans = hp2;
}
dp[v][hp2] = dp[u][hp]+w;
if(ins[v][hp2]==false){
ins[v][hp2] = true;
que.push(MP(v,hp2));
}
}
}
}
return MP(getout,ans);
}
int main(){
int n,m,H,S,E;
while(~scanf("%d%d%d%d%d",&n,&m,&H,&S,&E)){
memset(ed,false,sizeof(ed));
init();
for(int i=;i<m;++i){
int u,v,w,r,p;
scanf("%d%d%d%d%d",&u,&v,&w,&r,&p);
addedge(u,v,w,r,p);
addedge(v,u,w,r,p);
}
for(int i=;i<E;++i){
int tmp;
scanf("%d",&tmp);
ed[tmp] = true;
}
pair<int,int> cur = spfa(H,S);
int getout = cur.first;
int ans = cur.second;
if(getout!=-){
puts("YES");
printf("%d\n",ans);
dfs(getout,ans,S,);
puts("");
}else puts("NO");
}
return ;
}

非二分代码

sgu 240 Runaway (spfa)的更多相关文章

  1. 模板C++ 03图论算法 1最短路之单源最短路(SPFA)

    3.1最短路之单源最短路(SPFA) 松弛:常听人说松弛,一直不懂,后来明白其实就是更新某点到源点最短距离. 邻接表:表示与一个点联通的所有路. 如果从一个点沿着某条路径出发,又回到了自己,而且所经过 ...

  2. 最短路(SPFA)

    SPFA是Bellman-Ford算法的一种队列实现,减少了不必要的冗余计算. 主要思想是: 初始时将起点加入队列.每次从队列中取出一个元素,并对所有与它相邻的点进行修改,若某个相邻的点修改成功,则将 ...

  3. Bellman-Ford算法及其队列优化(SPFA)

    一.算法概述 Bellman-Ford算法解决的是一般情况下的单源最短路径问题.所谓单源最短路径问题:给定一个图G=(V,E),我们希望找到从给定源结点s属于V到每个结点v属于V的最短路径.单源最短路 ...

  4. codevs 1021 玛丽卡(spfa)

    题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们 ...

  5. 【POJ】1062 昂贵的聘礼(spfa)

    http://poj.org/problem?id=1062 此题一开始果断想到暴力.. 但是n<=100果断不行. 一看题解,噗!最短路... 构图很巧妙. 每一个物品对应的所需物品相当于一个 ...

  6. POJ1860Currency Exchange(SPFA)

    http://poj.org/problem?id=1860 题意:  题目中主要是说存在货币兑换点,然后现在手里有一种货币,要各种换来换去,最后再换回去的时候看能不能使原本的钱数增多,每一种货币都有 ...

  7. 【NOIP 2013 DAY2 T3】 华容道(spfa)

    题目描述 [问题描述] 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果能完成, 最少需要多少时间. 小 ...

  8. HDU ACM 1690 Bus System (SPFA)

    Bus System Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  9. Haunted Graveyard ZOJ - 3391(SPFA)

    从点(n,1)到点(1,m)的最短路径,可以转换地图成从(1,1)到(n,m)的最短路,因为有负权回路,所以要用spfa来判负环, 注意一下如果负环把终点包围在内的话, 如果用负环的话会输出无穷,但是 ...

随机推荐

  1. 使用 win+r 命令行打开我们的桌面应用(处女座的福音)

    首先新建一个文件夹,名为quickapp,然后在地址栏复制文件目录地址,进入系统高级设置,修改系统环境变量Path,双击后选择新建,输入quickapp文件目录地址,确认保存. 如何修改path变量? ...

  2. django models进行数据库增删查改

    在cmd 上运行 python manage.py shell   引入models的定义 from app.models import  myclass   ##先打这一行    ------这些是 ...

  3. Sqlite使用

    安装命令行工具从http://www.sqlite.org/download.html下载Precompiled Binaries for Windows下的sqlite-tools-win32-x8 ...

  4. CSS-各种cs样式之浏览器兼容处理方式汇总大全(更新中...)

    页面模板 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 ...

  5. CSS style和HTML style有什么区别?

    https://zhidao.baidu.com/question/1238362131134658699.html 没有什么区别啊,都是样式的意思. 没有分别的!CSS提高代码重用性,加速浏览器下载 ...

  6. 今天开始学习java编程

    <java>程序设计教程与上机实验

  7. dict与list的in 操作的速度

    今天刷一道题,计算一串数字中其中两个数字相加等于目标值的题目,且取其中最早的两个数字(最后一个数字的位置靠前). 如[1,25,32,4,3,6,9,5]  targer:9  输出 [3,6]   ...

  8. Tengine 安装配置全过程

    Tengine官网上有个非常简单的教程,中间并未涉及到一些常用的设置,所以仅供参考.一下午为本人的安装步骤及过程. 1.安装必要的编译环境好 由于Tengine安装需要使用源代码自行编译,所以在安装前 ...

  9. c# 面向方面编程

    AOP面向切面编程(Aspect Oriented Programming),是通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术.Spring框架用的核心技术就是AOP,是函数式编程的一 ...

  10. 连接池的实现 redis例子

    # -*- encoding:utf-8 -*- # import pymysql # # conn = pymysql.connect(host="127.0.0.1", por ...