题意: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. IO流-----写到输出流

    输出流:---链接:http://blog.csdn.net/du_minchao/article/details/49045421 /** * 方法名:writeStream * 方法描述:写到输出 ...

  2. Rabin-Karp指纹字符串查找算法

    首先计算模式字符串的散列函数, 如果找到一个和模式字符串散列值相同的子字符串, 那么继续验证两者是否匹配. 这个过程等价于将模式保存在一个散列表中, 然后在文本中的所有子字符串查找. 但不需要为散列表 ...

  3. java学习笔记之线程1

    1.线程的概念 线程是系统中最小的执行单元,同一进程有多个线程,多个线程共享进程的资源. 线程调用yield()方法使线程从运行状态转入可运行状态,让出资源: 线程调用sleep()方法使线程由运行状 ...

  4. 【BZOJ-3143】游走 高斯消元 + 概率期望

    3143: [Hnoi2013]游走 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2264  Solved: 987[Submit][Status] ...

  5. UEFI模式安装Win10和Linux双系统

    最近心血来潮,想装一个Linux.Windows双系统,吸取上次安装的经验,这次一定都要使用UEFI模式启动,需要注意的是必须是支持此种启动模式的系统(一般解压之后都有efi文件夹不需要刻录),这次遇 ...

  6. bzoj 2141: 排队

    2141: 排队 Time Limit: 4 Sec Memory Limit: 259 MB Description 排排坐,吃果果,生果甜嗦嗦,大家笑呵呵.你一个,我一个,大的分给你,小的留给我, ...

  7. js 对象的_proto_

    js 对象呢,有个属性叫_proto_,以前没听说过,也没关注,最近看这个原型,就被迫知道了这个东西,js 这里面的东西,真是规定的很奇怪,具体为啥也不知道,就测试发现的,对象的_proto_属性,和 ...

  8. Html中自定义鼠标的形状

    Html中自定义鼠标的形状 <html> <head> <title>自定义的鼠标形状</title> <meta http-equiv=&quo ...

  9. jdk 安装 环境变量配置

    右键选择 计算机→属性→高级系统设置→高级→环境变量 1.系统变量→新建 变量名:JAVA_HOME 变量值:(变量值填写你的jdk的安装目录,例如本人是 C:\Program Files\Java\ ...

  10. C# 开源框架

    一.AOP框架        Encase 是C#编写开发的为.NET平台提供的AOP框架.Encase 独特的提供了把方面(aspects)部署到运行时代码,而其它AOP框架依赖配置文件的方式.这种 ...