火车停留 wiki 1035

2024-05-10 12:18
文章标签 1035 火车 wiki 停留

本文主要是介绍火车停留 wiki 1035,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

首先这题N和M都很小,可以往网络流方面想。

怎么用网络流搞呢,其实就是按题目描述搞,cost显然就是费用,而每个站台同一时间只能停一辆车,以及总站台数的限制显然就是流量,想到这里基本上脑子里已经有一个大概的模型了。

1.肯定要拆点,因为涉及到时间,不拆点不能处理时间的前后关系。

2.拆点肯定是按火车拆,因为火车可以随意选择剩下的车站,以车站为点显然不方便。

以上两点想到之后这题就基本解决了,可以着手建图了。

1.对于火车 i ,拆成两个点,i 和 i’ ,向 i‘ 连一条容量为1,费用为cost[i]的边,表示这辆火车进站停留。

2.建立一个源点S,从S向每个连一条容量为1,费用为0的边,表示这辆车为第一个进入车站停留的(由于语文不好,这里可能有点表意不清,大家稍微想一想应该就懂了)

3.建立一个汇点T,从每个i’ 向T连一条容量为1,费用为0的边,表示这辆车为最后一个出站的(同上)

4.建立一个超级汇点ST,从T向ST连一条容量为n,费用为0的边,用来限制n个车站

5.对于每个ij,若满足reach[i]+stay[i]<reach[j],就从i‘ 向 连一条容量为1,费用为0的边,表示i出站之后,j可以进同一个站

整个建图过程直观清晰。

然后做S到ST的最大费用最大流就可以了

TIPS:1.最大费用最大流可以将边的费用取反,之后用最小费用流的SPFA做,答案取反就可以了。

          2.答案别忘了除以100

我的AC代码

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <queue>
#include <vector>
using namespace std;
#define INT_MAX 0x07777777
struct Edge {int from, to, cap, flow, cost;
};
int n,m,sz,s,t,result;
vector<Edge> edges;
vector<int> G[300];
int inq[300],a[300],d[300],reach[300],cost[300],stay[300],node[300],p[300];
void add(int from, int to, int cap, int cost){edges.push_back(Edge{from,to,cap,0,cost});edges.push_back(Edge{to,from,0,0,-cost});int count = edges.size();G[from].push_back(count-2);G[to].push_back(count-1);
}
void init(){scanf("%d%d", &n,&m);for(int i = 0; i < m; i++){scanf("%d%d%d", &reach[i], &cost[i], &stay[i]);cost[i] = -cost[i];}add(0, 1, n, 0);sz = 2;for(int i = 0; i < m; i++){node[i] = sz;add(1, sz, 1, 0);sz++;add(sz-1,sz,1,cost[i]);sz++;}for(int i = 0; i < m; i++){add(node[i]+1, sz, 1, 0);}sz++;t = sz-1;for(int i = 0; i < m; i++){for(int j = 0; j < m; j++){if(i!=j && reach[i]+stay[i]<reach[j]){add(node[i]+1, node[j], 1, 0);}}}
}
void solve(){result = 0;memset(a, 0, sizeof(a));a[0] = INT_MAX;while (true) {memset(inq, 0, sizeof(inq));inq[0] = 1;for(int i = 0; i < 300; i++) d[i] = INT_MAX;d[0] = 0;queue<int> q;q.push(0);while (!q.empty()) {int u = q.front();q.pop();inq[u] = 0;for(int i = 0; i < G[u].size(); i++){Edge& e = edges[G[u][i]];if (d[e.to] > d[e.from]+e.cost && e.cap > e.flow) {d[e.to] = d[e.from]+e.cost;a[e.to] = (a[u] < e.cap-e.flow ? a[u] : e.cap-e.flow);p[e.to] = G[u][i];if(!inq[e.to]) {q.push(e.to); inq[e.to] = 1;}}}}if (d[t]==INT_MAX) break;int u = t;while (u) {edges[p[u]].flow += a[t];edges[p[u]^1].flow -= a[t];u = edges[p[u]].from;}result += a[t]*d[t];}printf("%.2f\n", -(((double)result))/100);
}
int main(int argc, const char * argv[])
{init();solve();
}


这篇关于火车停留 wiki 1035的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/976420

相关文章

java实训 | 低配版模拟火车订票系统

代码:  import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.util.ArrayList;import java.util.List;public class TrainBookingSystem {private JFrame frame;private JPanel

今天遇到的3到智力面试题(给工人分金条,小鸟来回在2火车之间飞行的距离,精确称水问题)

智力题1:你让工人为你工作7天,给工人的回报是一根金条。金条平分成相连的7段,你必须在每天结束时给他们一段金条,如果只许你两次把金条弄断,你如何给你的工人付费? 答:把金条2次弄断的方式是第一次1,6分,,然后把剩余的6用2,4分,即弄断2次为1段、2段、4段 第一天给1段, 第二天让工人把1段归还给2段, 第三天给1段, 第四天归还1段和2段,给4段。 第五天给1段, 第六天给2

J2ME wiki

为了总结j2me的相关经验,将平时零碎的经验汇集于此 为什么学习老旧de j2me? 的确j2me已经过气,但是作为一个api,她与安卓具有一定的可比性,有助于我对api系统特点的学习,她们的共同性可以为我将来研究汽车api提供帮助。 eclipseme插件 参考Eclipse 安装插件 wtk WTK是针对移动设备的Java api类库 建立j2me项目 生成ja

团队知识管理首选:12款优秀开源Wiki系统推荐

文章介绍了12款好用的开源Wiki:PingCode、DokuWiki、MediaWiki、Tiki Wiki CMS Groupware、XWiki、BookStack、PMWiki、Foswiki、GitBook、Wiki.js、TiddlyWiki、Slite。以及对比了一款非开源但提供免费版本的Wiki工具,以供大家选择。 在企业知识管理和团队协作中,Wiki系统因其强大的编辑和组

解决Ubuntu输入密码后无法进入桌面,一直停留在登陆界面的问题

不知道今天做了些什么诡异的操作,刚才重启了Ubuntu之后,发现输入密码之后,闪了一下又回到了登陆界面,根本无法进入系统~心想完了,好不容易把Ubuntu弄得个人十分的满意,那不成要重新启动。不用不用,经过了1个小时的担惊受怕,问题终于解决,使得我能够现在在这里敲下这一篇博文! 网上说好像是说修改了什么系统变量,反正我不懂,百度了n就之后无解,换用谷歌,立马找到解决方案…… 在登陆界面按下Ct

微信浏览器自带的返回上一页的停留位置 scrollTop

我们做过微信的应该都知道,微信自带的返回上一页,就是重新打开页面。并不是返回历史页面。我们PC端的浏览器是返回历史页面。点击返回页面之后 上一个页面的scrollTop还是之前没有进入新页面的位置。 我看了下京东的微信网站。果然和我想到的方法一样。利用sessionStorage HTML5本地存储 进行存储位置scrollTop以及加载了多少次ajax次数 微信返回上一页(当前页面)之后。就会

【wiki知识库】06.文档管理页面的添加--前端Vue部分

📝个人主页:哈__ 期待您的关注  目录 一、🔥今日目标  二、🐻前端Vue模块的改造 BUG修改 1.wangeditor无法展示问题 2.弹窗无法正常关闭问题 2.1 添加admin-doc.vue 2.1.1 点击admin-ebook中的路由跳转到admin-doc  2.2.2 进入到admin-doc中调用初始化查询方法 2.2.3 文档编辑

MyEclipse 无法非法关闭,导致无法启动,一直停留在Loading workbench启动页面

MyEclipse 无法非法关闭,导致无法启动,一直停留在Loading workbench启动页面解决方案:       1.(推荐使用):       到<workspace>\.metadata\.plugins\org.eclipse.core.resources目录,删除文件 .snap      2.(如果没有 .snap 这个文件,就使用方案 2):      进入

【wiki知识库】04.SpringBoot后端实现电子书的增删改查以及前端界面的展示

📝个人主页:哈__ 期待您的关注  目录 一、🔥今日内容 二、🌏前端页面的改造 2.1新增电子书管理页面 2.2新增路由规则 2.3修改the-header代码 三、🚗SpringBoot后端Ebook模块改造 3.1增加电子书增/改接口 3.1.1新增EbookSaveParam 3.1.2添加Controller代码 3.1.3在Ebook实

安装npm install时,长时间停留在fetchMetadata: sill

安装npm install时,长时间停留在fetchMetadata: sill   更换仓库地址:npm config set registry https://registry.npm.taobao.org   查询当前仓库地址:npm config get registry     或 npm info express