sgu 240 Runaway (spfa)

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

 

羞涩的题意

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

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

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

 

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <iostream>
  4 #include <cmath>
  5 #include <algorithm>
  6 #include <vector>
  7 #include <string>
  8 #include <set>
  9 #include <queue>
 10 using namespace std;
 11 
 12 #define ll long long
 13 #define MP make_pair
 14 
 15 #define inf 0x3f3f3f3f
 16 #define eps 1e-8
 17 
 18 #define maxn 110
 19 struct edge{
 20     int v,nxt;
 21     int w,r,p;
 22 }e[maxn*maxn*2];
 23 int head[maxn], sz;
 24 void init(){sz=0;memset(head,-1,sizeof(head));}
 25 void addedge(int u,int v,int w,int ri,int pi){
 26     e[sz].v=v,e[sz].nxt=head[u];
 27     e[sz].w=w,e[sz].r=ri,e[sz].p=pi;
 28     head[u]=sz++;
 29 }
 30 int dp[maxn][10010];
 31 bool ed[maxn];
 32 bool ins[maxn][10010];
 33 int pre[maxn][10010][2];
 34 int getout;
 35 void dfs(int u,int hp,int S,int cnt){
 36     if(u==S){printf("%d %d",cnt+1,u);return ;}
 37     dfs(pre[u][hp][0],pre[u][hp][1],S,cnt+1);
 38     printf(" %d",u);
 39 }
 40 bool check(int mahp, int S){
 41     memset(dp,0x3f,sizeof(dp));
 42     dp[S][0] = 0;
 43     memset(ins,false,sizeof(ins));
 44     ins[S][0] = true;
 45     queue<pair<int,int> >que;
 46     que.push(MP(S,0));
 47     if(ed[S]){getout = S;return true;}
 48     while(!que.empty()){
 49         int u = que.front().first;
 50         int hp = que.front().second;
 51         int t = dp[u][hp];
 52         que.pop();
 53         ins[u][hp] = false;
 54         for(int i=head[u];i!=-1;i=e[i].nxt){
 55             int v = e[i].v;
 56             int w = e[i].w;
 57             int r = e[i].r;
 58             int p = e[i].p;
 59             ll tmp = r+p*(t+w);
 60             if(tmp>mahp) continue;
 61             int hp2 = max(hp,int(tmp));
 62             if(dp[v][hp2]>dp[u][hp]+w){
 63                 pre[v][hp2][0] = u;
 64                 pre[v][hp2][1] = hp;
 65                 if(ed[v]){getout = v;return true;}
 66                 dp[v][hp2] = dp[u][hp]+w;
 67                 if(ins[v][hp2]==false){
 68                     ins[v][hp2] = true;
 69                     que.push(MP(v,hp2));
 70                 }
 71             }
 72         }
 73     }
 74     return false;
 75 }
 76 int main(){
 77     int n,m,H,S,E;
 78     while(~scanf("%d%d%d%d%d",&n,&m,&H,&S,&E)){
 79         memset(ed,false,sizeof(ed));
 80         init();
 81         for(int i=0;i<m;++i){
 82             int u,v,w,r,p;
 83             scanf("%d%d%d%d%d",&u,&v,&w,&r,&p);
 84             addedge(u,v,w,r,p);
 85             addedge(v,u,w,r,p);
 86         }
 87         for(int i=0;i<E;++i){
 88             int tmp;
 89             scanf("%d",&tmp);
 90             ed[tmp] = true;
 91         }
 92         int l=0,r=H+1;
 93         while(l<r){
 94             int mid = (l+r)/2;
 95             if(check(mid,S)) r = mid;
 96             else l = mid+1;
 97         }
 98         if(r<=H){
 99             puts("YES");
100             printf("%d\n",r);
101             check(r,S);
102             dfs(getout,r,S,0);
103             puts("");
104         }else puts("NO");
105     }
106     return 0;
107 }
二分代码

 

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <iostream>
  4 #include <cmath>
  5 #include <algorithm>
  6 #include <vector>
  7 #include <string>
  8 #include <set>
  9 #include <queue>
 10 using namespace std;
 11 
 12 #define ll long long
 13 #define MP make_pair
 14 
 15 #define inf 0x3f3f3f3f
 16 #define eps 1e-8
 17 
 18 #define maxn 110
 19 struct edge{
 20     int v,nxt;
 21     int w,r,p;
 22 }e[maxn*maxn*2];
 23 int head[maxn], sz;
 24 void init(){sz=0;memset(head,-1,sizeof(head));}
 25 void addedge(int u,int v,int w,int ri,int pi){
 26     e[sz].v=v,e[sz].nxt=head[u];
 27     e[sz].w=w,e[sz].r=ri,e[sz].p=pi;
 28     head[u]=sz++;
 29 }
 30 int dp[maxn][10010];
 31 bool ed[maxn];
 32 bool ins[maxn][10010];
 33 int pre[maxn][10010][2];
 34 void dfs(int u,int hp,int S,int cnt){
 35     if(u==S){printf("%d %d",cnt+1,u);return ;}
 36     dfs(pre[u][hp][0],pre[u][hp][1],S,cnt+1);
 37     printf(" %d",u);
 38 }
 39 pair<int,int> spfa(int mahp, int S){
 40     int getout=-1,ans = mahp+1;
 41     memset(dp,0x3f,sizeof(dp));
 42     dp[S][0] = 0;
 43     memset(ins,false,sizeof(ins));
 44     ins[S][0] = true;
 45     queue<pair<int,int> >que;
 46     que.push(MP(S,0));
 47     if(ed[S]) return MP(S,0);
 48     while(!que.empty()){
 49         int u = que.front().first;
 50         int hp = que.front().second;
 51         int t = dp[u][hp];
 52         que.pop();
 53         ins[u][hp] = false;
 54         if(hp>=ans) continue;
 55         for(int i=head[u];i!=-1;i=e[i].nxt){
 56             int v = e[i].v;
 57             int w = e[i].w;
 58             int r = e[i].r;
 59             int p = e[i].p;
 60             ll tmp = r+p*(t+w);
 61             if(tmp>mahp) continue;
 62             int hp2 = max(hp,int(tmp));
 63             if(hp2>=ans) continue;
 64             if(dp[v][hp2]>dp[u][hp]+w){
 65                 pre[v][hp2][0] = u;
 66                 pre[v][hp2][1] = hp;
 67                 if(ed[v]){
 68                     getout = v;
 69                     ans = hp2;
 70                 }
 71                 dp[v][hp2] = dp[u][hp]+w;
 72                 if(ins[v][hp2]==false){
 73                     ins[v][hp2] = true;
 74                     que.push(MP(v,hp2));
 75                 }
 76             }
 77         }
 78     }
 79     return MP(getout,ans);
 80 }
 81 int main(){
 82     int n,m,H,S,E;
 83     while(~scanf("%d%d%d%d%d",&n,&m,&H,&S,&E)){
 84         memset(ed,false,sizeof(ed));
 85         init();
 86         for(int i=0;i<m;++i){
 87             int u,v,w,r,p;
 88             scanf("%d%d%d%d%d",&u,&v,&w,&r,&p);
 89             addedge(u,v,w,r,p);
 90             addedge(v,u,w,r,p);
 91         }
 92         for(int i=0;i<E;++i){
 93             int tmp;
 94             scanf("%d",&tmp);
 95             ed[tmp] = true;
 96         }
 97         pair<int,int> cur = spfa(H,S);
 98         int getout = cur.first;
 99         int ans = cur.second;
100         if(getout!=-1){
101             puts("YES");
102             printf("%d\n",ans);
103             dfs(getout,ans,S,0);
104             puts("");
105         }else puts("NO");
106     }
107     return 0;
108 }
非二分代码

 

转载于:https://www.cnblogs.com/nextbin/p/4358468.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/406157.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入react技术栈(1):React简介

我是歌谣 放弃很容易 但是坚持一定很酷 微信公众号关注前端小歌谣获取前端知识 前言 专注视图层 Virtual DOM 真实页面对应一个DOM树.在传统页面的开发模式中 每次更新页面都需要手动更新 DOM操作非常昂贵。我们都知道在前端开发中&#xff0c;性能消耗最大的就是DOM操作 而且这…

Capistrano3 与 Mina

链接&#xff1a; http://blog.naixspirit.com/2014/12/14/cap_and_mina/ Capistrano 0. 服务器目录结构 首先来看看经过多次部署后, 服务器会生成一个这样的目录结构 ├── current -> /var/www/your_app/releases/20141201042659 ├── releases │ ├── 2014120103…

金山毒霸的云查杀很牛X

金山毒霸的云查杀很牛X无论安装包大小、资源占用率、查杀率、还是新病毒反应速度&#xff08;秒级对比&#xff09;&#xff0c;牛X!听说&#xff0c;金山毒霸2011-增加了免费服务时间&#xff01;以后是否也会全免费&#xff1f;既然免费了&#xff0c;就试试吧&#xff01;下…

python中空位符_python中空位符_Python之路 - Python - 字符编码 - 期权论坛

字符编码python解释器在加载 .py 文件中的代码时&#xff0c;会对内容进行编码(默认ascill)ASCII(American Standard Code for Information Interchange&#xff0c;美国标准信息交换代码)是基于拉丁字母的一套电脑编码系统&#xff0c;主要用于显示现代英语和其他西欧语言&…

python爬虫爬汽车图片_Python快速爬取车标网图片,以后不要说这什么车你不认识了!...

知识不分边界......人&#xff0c;为什么要读书&#xff1f;举个例子:当看到天边飞鸟&#xff0c;你会说&#xff1a;“落霞与孤鹜齐飞&#xff0c;秋水共长天一色。”而不是&#xff1a;“卧靠&#xff0c;好多鸟。”;当你失恋时你低吟浅唱道&#xff1a;“人生若只如初见&…

电化学仿真的基础知识笔记

1 概述 电化学反应是一种特殊的化学反应&#xff0c;其能量转移形式为化学能和电能之间互相转换。根据能量转换方向&#xff0c;可分为两类&#xff1a; 原电池&#xff08;Galvanic cells&#xff09;&#xff1a;将化学能转化为电能&#xff0c;对外放电电解槽&#xff08;…

mysql以秒为单位限制资源_MYSQL中限制资源的使用

今天看到手册&#xff0c;不小心看到了这里&#xff0c;自己做了几个例子。从MYSQL4.x开始&#xff0c;MYSQL就增加了以每个用户为基础&#xff0c;限制MYSQL服务器的资源利用。自己查看MYSQL.USER 表就会发现里面最后几个字段&#xff1a;mysql> select version();--------…

漫谈经典排序算法:一、从简单选择排序到堆排序的深度解析

From: http://blog.csdn.net/touch_2011/article/details/6767673 1、序言 这是《漫谈经典排序算法系列》第一篇&#xff0c;该篇从最简单的选择排序算法谈起&#xff0c;由浅入深的详细解析两种选择排序算法的过程及性能比较。逐步揭露选择排序的本质及其基本思想。 各种排序算…

React开发(168):...dva调用不成功的原因

注意三对三对应关系 否则无法调用成功

深入react技术栈(2):JSX语法

JSX的由来 DOM元素 组件元素 JSX基本语法 XML基本语法 元素类型 、我们讲到两种不同的元素:DOM元素和组件元素 在JSX里面有对应 注释 元素属性 Boolean属性 展开属性 自定义属性 javascript属性表达式 属性值使用表达式 用{}表示 HTML转义 文章参考深入react学习技术栈

深入react技术栈(3):React组件

我是歌谣 放弃很容易 但是坚持一定很酷 微信公众号关注前端小歌谣 终于说出最为关心的react组件了。在react形成之前,组件封装都是在摸索之中 组件的演变 class定义组件的样式 这样可以方便的定义class前缀 一达到定义一系列主题的意义 初始化过程十分简洁 实例化传入几个参数给…

深入react技术栈(4):React数据流

我是歌谣 放弃很容易 但是坚持一定很酷 微信公众号关注前端小歌谣 state props 子组件props 组件props function prop 与父组件通信 propTypes 文章参考深入react学习技术栈

学会用taro封装一个组件

我是歌谣 放弃很容易 但是坚持一定很酷 微信公众号关注前端小歌谣学习前端知识 前言 大家好 我是歌谣 今天要说得是用taro封装一个组件 核心是学会弹性布局 直接上代码 组件部分 子组件 import Taro, { Component } from "tarojs/taro"; import { Text, View, Image…

java druid sqlite_springboot整合druid抛出dbType not support : sqlite异常

最近在搞springboot&#xff0c;将springboot和mybaits整合后没一点毛病&#xff0c;但想自己弄个sql监控&#xff0c;就准备使用阿里的druid来做连接池&#xff0c;毕竟是国产又是大厂出品&#xff0c;号称最牛X的连接池。整合过程就不说了&#xff0c;百度上大把的&#xff0…

深入react技术栈(6):React和DOM

我是歌谣 放弃很容易 但是坚持一定很酷 微信公众号关注前端小歌谣 React DoM findDoMNode render React得不稳定方法 Refs React之外得DoM操作 文章参考深入React技术栈