sgu 240 Runaway (spfa)
题意: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)的更多相关文章
- 模板C++ 03图论算法 1最短路之单源最短路(SPFA)
3.1最短路之单源最短路(SPFA) 松弛:常听人说松弛,一直不懂,后来明白其实就是更新某点到源点最短距离. 邻接表:表示与一个点联通的所有路. 如果从一个点沿着某条路径出发,又回到了自己,而且所经过 ...
- 最短路(SPFA)
SPFA是Bellman-Ford算法的一种队列实现,减少了不必要的冗余计算. 主要思想是: 初始时将起点加入队列.每次从队列中取出一个元素,并对所有与它相邻的点进行修改,若某个相邻的点修改成功,则将 ...
- Bellman-Ford算法及其队列优化(SPFA)
一.算法概述 Bellman-Ford算法解决的是一般情况下的单源最短路径问题.所谓单源最短路径问题:给定一个图G=(V,E),我们希望找到从给定源结点s属于V到每个结点v属于V的最短路径.单源最短路 ...
- codevs 1021 玛丽卡(spfa)
题目描述 Description 麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们 ...
- 【POJ】1062 昂贵的聘礼(spfa)
http://poj.org/problem?id=1062 此题一开始果断想到暴力.. 但是n<=100果断不行. 一看题解,噗!最短路... 构图很巧妙. 每一个物品对应的所需物品相当于一个 ...
- POJ1860Currency Exchange(SPFA)
http://poj.org/problem?id=1860 题意: 题目中主要是说存在货币兑换点,然后现在手里有一种货币,要各种换来换去,最后再换回去的时候看能不能使原本的钱数增多,每一种货币都有 ...
- 【NOIP 2013 DAY2 T3】 华容道(spfa)
题目描述 [问题描述] 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面, 华容道是否根本就无法完成,如果能完成, 最少需要多少时间. 小 ...
- HDU ACM 1690 Bus System (SPFA)
Bus System Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- Haunted Graveyard ZOJ - 3391(SPFA)
从点(n,1)到点(1,m)的最短路径,可以转换地图成从(1,1)到(n,m)的最短路,因为有负权回路,所以要用spfa来判负环, 注意一下如果负环把终点包围在内的话, 如果用负环的话会输出无穷,但是 ...
随机推荐
- c# json总结
json确实很好用,但是网上写的很多都很复杂,不适合自己,然后每次写了又记不住,又要反复找,所以将其中的代码写下来.以后看这个就可以了 都引用了 Newtonsoft.Json 1.ashx,asmx ...
- BZOJ 4726: [POI2017]Sabota?
4726: [POI2017]Sabota? Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 301 Solved ...
- UOJ58 【WC2013】糖果公园
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
- Django中 如何修改models字段的默认值
场景描述: 在建表的时候,新闻表的内容简介字段,给的默认值是可以为空的,但是没有设置默认值为blank,那么,这种情况下,对于只有标题,没有内容简介的新闻来讲,发布之后,前端显示的内容简介位置是non ...
- Linux下几款好用的录屏软件
最近需要在Linux环境下录制一段视频,自己的Linux是LinuxMint Xfce 18,网上搜了一圈发现都不太顺手.尤其是VLC,感觉不是很易用,幸好最后在Linux自带的软件管理器找到了两个不 ...
- CentOS 7网卡网桥、绑定设置
一.网卡桥接设置: 1.网卡配置文件: [root@localhost /]# vim /etc/sysconfig/network-scripts/ifcfg-enp8s0 TYPE=Etherne ...
- Nginx配置SSL证书部署HTTPS网站
1.购买ssl证书 购买网站:沃通 2.上传证书到nginx服务器,然后进行解压. 解压后的的效果: [root@bubidev-ng3 nginx]# pwd/etc/nginx [root@bub ...
- python安装、模块安装
python安装 windows 下载安装包 https://www.python.org/downloads 改环境变量 [右键计算机]-->[属性]-->[高级系统设置]-->[ ...
- Express4+Mongodb超简单入门实例
开始前,请确保mongodb已经能正常工作,安装教程:windows下MongoDB的安装及配置 , 请自行安装配置.下面进入正文: 第一步:命令行创建数据库.表,并插入一条数据 命令如下: //创建 ...
- quantum sets
the principles of quantum mechanics by p.a.m.dirac.