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来判负环, 注意一下如果负环把终点包围在内的话, 如果用负环的话会输出无穷,但是 ...
随机推荐
- 【转】iOS,搜索标签布局
前一阵时间,看过这样一个demo,代码不多,但是简洁易懂. 转自: // 代码地址: https://github.com/iphone5solo/PYSearch // 代码地址: http:/ ...
- UICollectionView中使用 UICollectionViewFlowLayout进行布局(模仿苹果相册)
现在都知道,在初始化UICollectionView的时候,必须要传入一Layout对象,进行布局管理.这也是collectionview和tableview的明显区别,通过collectionvie ...
- mysql-netstat
在Linux服务器中想要查看连接到服务器的所有IP地址只需要输入命令netstat -an就可以看到全部的资料. 该命令的常见参数供您参考: -a (all)显示所有选项,默认不显示LISTEN相关: ...
- bzoj1415[NOI2005]聪聪和可可-期望的线性性
这道题之前我写过一个巨逗比的写法(传送门:http://www.cnblogs.com/liu-runda/p/6220381.html) 当时的原因是这道题可以抽象出和"绿豆蛙的归宿&qu ...
- Java时间类型转换
String转Long Long long=new SimpleDateFormat("yyyyMMddHHmmss").parse(String).getTime(); Long ...
- python模块(shelve,xml,configparser,hashlib,logging)
1.1shelve模块 shelve 模块比pickle模块简单,只有一个open函数,返回类似字典对象,可读可写:key必须为字符串, 而值可以是python所支持的数据类型. shelve模块主要 ...
- ip扫描
ipscan24 Advanced IP Scanner http://www.advanced-ip-scanner.com/cn/
- wamp 修改默认apache 80端口
wamp server 环境安装包 修改默认80端口 D:\wamp\bin\apache\apache2.4.9\conf\httpd.conf 找到如下代码出修改后,重启apache即可 ## L ...
- juery学习总结——例子
1.select元素在选择是找到选择的值和option中的值 <!DOCTYPE html> <html> <head lang="en"> & ...
- 耗时两月,NHibernate系列出炉
写在前面 这篇总结本来是昨天要写的,可昨天大学班长来视察工作,多喝了点,回来就倒头就睡了,也就把这篇总结的文章拖到了今天. nhibernate系列从开始着手写,到现在前后耗费大概两个月的时间,通过总 ...