【2019南昌网络赛】B-Fire-Fighting Hero
分析
英雄方面很简单,跑一遍 Dijkstra 就行了,但是灭火团队就有点麻烦了。
这里可以借助一下最大流的建边来解决这个问题:
我们可以另外找一个点作为起点,然后建立从那个点到每一个团队的起点的边,权值为0,这样就完成了多起点的最短路
恰好我的板子是封装好的 Dijkstra ,我就直接建立两个结构体解决问题,因为点的数量只有 1000 个,空间上已经没有什么顾虑了
AC-Code
#include <bits/stdc++.h>
using namespace std;
#define MAXN 1100
#define MAXM 1000000
#define INF 0x3fffffff //防止后面溢出,这个不能太大
struct Graph {
struct Edge {
long long to, next;
long long cost;
} edge[MAXM];
long long head[MAXN];
long long tot;
void init(long long n) {
tot = 0;
memset(head, -1, sizeof(long long) * (n + 1));
}
void add_edge(long long from, long long to, long long value) {
edge[tot].to = to;
edge[tot].cost = value;
edge[tot].next = head[from];
head[from] = tot++;
}
};
struct Dijkstra {
long long low_cost[MAXN];
bool vis[MAXN];
long long pre[MAXN];
void solve(long long b, long long e, long long start, Graph &graph) {
for (long long i = b; i < e; i++) {
low_cost[i] = INF;
vis[i] = false;
pre[i] = -1;
}
low_cost[start] = 0;
vis[start] = true;
long long cur_edge = graph.head[start];
while (cur_edge != -1) {
if (!vis[graph.edge[cur_edge].to] &&
low_cost[start] + graph.edge[cur_edge].cost < low_cost[graph.edge[cur_edge].to]) {
low_cost[graph.edge[cur_edge].to] = low_cost[start] + graph.edge[cur_edge].cost;
pre[graph.edge[cur_edge].to] = start;
}
cur_edge = graph.edge[cur_edge].next;
}
for (long long j = b; j < e - 1; j++) {
long long k = -1;
long long Min = INF;
for (long long i = b; i < e; i++) {
if (!vis[i] && low_cost[i] < Min) {
Min = low_cost[i];
k = i;
}
}
if (k == -1)
break;
vis[k] = true;
cur_edge = graph.head[k];
while (cur_edge != -1) {
if (!vis[graph.edge[cur_edge].to] &&
low_cost[k] + graph.edge[cur_edge].cost < low_cost[graph.edge[cur_edge].to]) {
low_cost[graph.edge[cur_edge].to] = low_cost[k] + graph.edge[cur_edge].cost;
pre[graph.edge[cur_edge].to] = k;
}
cur_edge = graph.edge[cur_edge].next;
}
}
}
};
Graph graph;
Dijkstra dijkstra1, dijkstra2;
int k_node[MAXN];
void solve() {
long long t;
cin >> t;
long long v, e, s, k, c;
for (int ts = 0; ts < t; ++ts) {
cin >> v >> e >> s >> k >> c;
graph.init(v + 1);
for (int i = 0; i < k; ++i) {
cin >> k_node[i];
}
long long from, to, value;
for (long long i = 0; i < e; ++i) {
cin >> from >> to >> value;
graph.add_edge(from, to, value);
graph.add_edge(to, from, value);
}
dijkstra1.solve(1, v + 1, s, graph);//第一次跑dijkstra
for (int i = 0; i < k; ++i) {
graph.add_edge(0, k_node[i], 0); // 这里设定超级源点为0,建立从0到每一个团队起点的边,权值为0
}
dijkstra2.solve(0, v + 1, 0, graph);//第二次跑dijkstra
long long s_min_max = 0;
for (long long i = 1; i < v + 1; ++i)
s_min_max = max(s_min_max, dijkstra1.low_cost[i]);
long long k_min_max = 0;
for (long long i = 1; i < v + 1; ++i)
k_min_max = max(k_min_max, dijkstra2.low_cost[i]);
if (s_min_max <= c * k_min_max)//考虑到精度问题,这里用乘法代替
cout << s_min_max << endl;
else
cout << k_min_max << endl;
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
#ifdef ACM_LOCAL
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
long long test_index_for_debug = 1;
char acm_local_for_debug;
while (cin >> acm_local_for_debug) {
cin.putback(acm_local_for_debug);
if (test_index_for_debug > 100) {
throw runtime_error("Check the stdin!!!");
}
auto start_clock_for_debug = clock();
cout << "Test " << test_index_for_debug << ":" << endl;
solve();
auto end_clock_for_debug = clock();
cerr << "Test " << test_index_for_debug++ << " Run Time: "
<< double(end_clock_for_debug - start_clock_for_debug) / CLOCKS_PER_SEC << "s" << endl;
cout << "\n--------------------------------------------------" << endl;
}
#else
solve();
#endif
return 0;
}
【2019南昌网络赛】B-Fire-Fighting Hero的更多相关文章
- 2019南昌网络赛I:Yukino With Subinterval(CDQ) (树状数组套主席树)
题意:询问区间有多少个连续的段,而且这段的颜色在[L,R]才算贡献,每段贡献是1. 有单点修改和区间查询. 思路:46min交了第一发树套树,T了. 稍加优化多交几次就过了. 不难想到,除了L这个点, ...
- ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval
ACM-ICPC 2019南昌网络赛I题 Yukino With Subinterval 题目大意:给一个长度为n,值域为[1, n]的序列{a},要求支持m次操作: 单点修改 1 pos val 询 ...
- ACM-ICPC 2019南昌网络赛F题 Megumi With String
ACM-ICPC 南昌网络赛F题 Megumi With String 题目描述 给一个长度为\(l\)的字符串\(S\),和关于\(x\)的\(k\)次多项式\(G[x]\).当一个字符串\(str ...
- 2019南昌网络赛 hello 2019
这道题和一道2017,2016的类似. A string t is called nice if a string “2017” occurs in t as a subsequence but a ...
- 2019南昌网络赛G. tsy's number
题意:\(\sum_{i=1}^n\sum_{j=1}^n\sum_{k=1}^n\frac{\phi(i)*\phi(j^2)*\phi(k^3)}{\phi(i)*\phi(j)*\phi(k)} ...
- 2019南昌网络赛-I(单调栈+线段树)
题目链接:https://nanti.jisuanke.com/t/38228 题意:定义一段区间的值为该区间的和×该区间的最小值,求给定数组的最大的区间值. 思路:比赛时还不会线段树,和队友在这题上 ...
- 2019南昌网络赛-M(二分)
题目链接:https://nanti.jisuanke.com/t/38232 题意:给定字符串s(长度<=1e5),然后N组样例(N<=1e5),每组输入一个字符串t判断t是否为s的字串 ...
- 2019南昌网络赛H The Nth Item(打表找询问循环节 or 分段打表)
https://nanti.jisuanke.com/t/41355 思路 从fib循环节入手,\(O(1e7log(1e9))\),tle 因为只需要输出所有询问亦或后的结果,所以考虑答案的循环节, ...
- 2019南昌网络赛 I. Yukino With Subinterval 树状数组套线段树
I. Yukino With Subinterval 题目链接: Problem Descripe Yukino has an array \(a_1, a_2 \cdots a_n\). As a ...
随机推荐
- 聊聊 Airtest 自动化工具
阅读文本大概需要 5 分钟. 很多读者看过之前的文章,发现我使用最多的是一款 Airtest 的自动化测试框架. Airtest 是一款适合于游戏和 App 的 UI 自动化测试框架. 下面对 Air ...
- 华为Mate 10牵手Microsoft Translator,让离线翻译可媲美在线神经网
编者按:日前,华为新发布的Mate 10手机系列采用Microsoft Translator技术实现了AI驱动型离线翻译功能.华为Mate 10是首款具有NPU(专用神经处理单元)的手机,可用于加速 ...
- HEXO+Git+Github+域名搭建个人博客
搭建个人博客可以分为以下五个部分 一.搭建本地环境(个人为Win10) 1.安装Git,下载地址:点击 下载后,按提示进行安装即可,作用是:把本地的内容提交到github上去 注意:官网下载速度不是很 ...
- Android API Levels
Android API Levels(转) 在本文中 API的级别是什么? 在Android中使用API级别 开发者需要考虑的内容 应用程序的向前兼容性 应用程序的向后兼容性 平台版本和API级别的选 ...
- Python:turtle库的使用及图形绘制
目录 一.绘制一个八边形 二.绘制一个八角图形 三.简述问题 四.循环程序设计 五.绘制一个自己喜欢的图形 一.绘制一个八边形 使用turtle库,绘制一个八边形 代码: from turtle im ...
- 【Spring Data 系列学习】了解 Spring Data JPA 、 Jpa 和 Hibernate
在开始学习 Spring Data JPA 之前,首先讨论下 Spring Data Jpa.JPA 和 Hibernate 之前的关系. JPA JPA 是 Java Persistence API ...
- criteria.setCacheable(true);这个方法是干什么用的
criteria.setCacheable(true); 一下是Criteria的底层源代码 /** * Enable caching of this query result, provided q ...
- Jsp页面中动态的引入另一个jsp,jsp:include路径是变量的实现
1 问题描述 在页面搭建时,会有这样的需求,希望局部页面动态的引用另一个jsp.这里的"动态"的意思引用的jsp的路径是个变量.举个例子,我们希望局部页面可能是page1.jsp或 ...
- Error response:/usr/bin/tf_serving_entrypoint.sh: line 3: 6 Illegal instruction (core dumped) ...
用docker部署tensorflow-serving:gpu时,参照官方文档:https://tensorflow.google.cn/tfx/serving/docker 本应该是很简单的部署,没 ...
- python入门到放弃-基本数据类型之tuple元组
#概述 元组俗称不可变的列表,又称只读列表,是python的基本数据类型之一, 用()小括号表示,里面使用,逗号隔开 元组里面可以放任何的数据类型的数据,查询可以,循环可以,但是就是不能修改 #先来看 ...