[USACO19JAN]Shortcut题解
本题算法:最短路树
这是个啥玩意呢,就是对于一个图,构造一棵树,使从源点开始的单源最短路径与原图一模一样。怎么做呢,跑一边Dijkstra,然后对于一个点u,枚举它的边,设当前的边为cur_edge,如果dis[u]+cue_edge的长度=dis[cur_edge的终点],那么显然这条边应该珂以是最短路树上的一条边,然后打一个标记表示cur_edge的终点不能再被加边了,题目要求字典序最小,显然u从1到n枚举珂以解决问题。
建好树以后跑一边DFS,我们知道当前节点u上连边的贡献是\((dis[u] - t) \times\)以\(u\)为根的子树的牛的个数,找到贡献最大的点更新答案即可。
代码:
#include <cstdio>
#include <queue>
#include <algorithm>
#include <set>
#include <map>
#define ll long long
using namespace std;
ll read(){
ll x = 0; int zf = 1; char ch = ' ';
while (ch != '-' && (ch < '0' || ch > '9')) ch = getchar();
if (ch == '-') zf = -1, ch = getchar();
while (ch >= '0' && ch <= '9') x = x * 10 + ch - '0', ch = getchar(); return x * zf;
}
struct Edge{
int from, to, next; ll dis;
} edges[1000001];
int head[300001], edge_num = 0;
ll dis[300001];
inline void addEdge(int u, int v, ll w){
edges[++edge_num] = (Edge){u, v, head[u], w};
head[u] = edge_num;
}
set< pair<ll, int> > que;
int n, t, s = 1;
void dijkstra(){
for (int i = 1; i <= n; ++i)
dis[i] = (1ll << 62);
dis[s] = 0; que.insert(make_pair(0, s));
pair<ll, int> uu; int u, v;
while (!que.empty()){
uu = *que.begin(); que.erase(uu);
u = uu.second;
for (int c_e = head[u]; c_e; c_e = edges[c_e].next){
v = edges[c_e].to;
if (dis[u] + edges[c_e].dis < dis[v]){
que.erase(make_pair(dis[v], v));
dis[v] = dis[u] + edges[c_e].dis;
que.insert(make_pair(dis[v], v));
}
}
}
}
vector<int> vec[100001];
ll ans = 0;
int a[100001];
int vis[100001];
int DFS(int u){
int v, cnt = 0; vis[u] = 1;
for (int i = 0; i < vec[u].size(); ++i){
v = vec[u][i];
if (!vis[v])
cnt += DFS(v);
}
cnt += a[u];
ans = max(ans, (dis[u] - t) * cnt);
return cnt;
}
int v2[100001];
signed main(){
int m; n = read(), m = read(), t = read();
for (int i = 1; i <= n; ++i) a[i] = read();
int u, v; ll w;
for (int i = 1; i <= m; ++i){
u = read(), v = read(), w = read();
addEdge(u, v, w), addEdge(v, u, w);
}
dijkstra();
for(int i = 1; i <= n; ++i)
for(int c_e = head[i]; c_e; c_e = edges[c_e].next)
if(dis[edges[c_e].to] == dis[i] + edges[c_e].dis && !v2[edges[c_e].to]){
v2[edges[c_e].to] = 1;
vec[i].push_back(edges[c_e].to), vec[edges[c_e].to].push_back(i);
}
DFS(1);
printf("%lld", ans);
return 0;
}
[USACO19JAN]Shortcut题解的更多相关文章
- USACO19JAN Gold题解
噩梦的回忆.. 上周日在机房打的模拟赛,结果十分惨烈,就最后一题yy出了正解结果玄学的只拿了80 考试结果:0+0+80=80 订正时对着T3打了2hours结果还是90 订正结果:100+100+9 ...
- Luogu P5201 [USACO19JAN]Shortcut 最短路树???
最短路树...开眼界了...之前想也没想过.... 先跑出来1到每个点最短路,然后建树时要标记点的入度,否则会多连边...然后深搜时更新新答案就是 #include<cstdio> #in ...
- LuoguP5201 [USACO19JAN]Shortcut(最短路树)
字典序?建树时从小枚举,用\(Dijkstra\)的血泪建好树,\(size\)大小决定贡献 #include <iostream> #include <cstdio> #in ...
- USACO比赛题泛刷
随时可能弃坑. 因为不知道最近要刷啥所以就决定刷下usaco. 优先级排在学习新算法和打比赛之后. 仅有一句话题解.难一点的可能有代码. 优先级是Gold>Silver.Platinum刷不动. ...
- 20190922 「HZOJ NOIP2019 Round #7」20190922模拟
综述 这次是USACO2019JAN Gold的题目. \(\mathrm{Cow Poetry}\) 题解 因为每句诗的长度一定是\(k\),所以自然而然想到背包. 设\(opt[i][j]\)代表 ...
- 树状数组 || 线段树 || Luogu P5200 [USACO19JAN]Sleepy Cow Sorting
题面:P5200 [USACO19JAN]Sleepy Cow Sorting 题解: 最小操作次数(记为k)即为将序列倒着找第一个P[i]>P[i+1]的下标,然后将序列分成三部分:前缀部分( ...
- P5204 [USACO19JAN]Train Tracking 2
P5204 [USACO19JAN]Train Tracking 2 毒毒题,对着嘤文题解看了贼久 首先考虑此题的一个弱化版本:如果输入的所有\(c_i\)相等怎么做 现在假设有\(len\)个数,取 ...
- LG5201 「USACO2019JAN」Shortcut 最短路树
\(\mathrm{Shortcut}\) 问题描述 LG5201 题解 最短路树. 显然奶牛的路径就是从\(1\)走到各个草地,于是从\(1\)跑最短路,构建最短路树. 为了保证字典序,从\(1\) ...
- 2016 华南师大ACM校赛 SCNUCPC 非官方题解
我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...
随机推荐
- 【Qt开发】foreach用法
If you just want to iterate over all the items in a container in order, you can use Qt's foreach key ...
- python+selenium元素定位之XPath学习01
参考文档1:https://www.w3school.com.cn/xpath/xpath_syntax.asp 参考文档2:https://www.runoob.com/xpath/xpath-tu ...
- 自己手动用原生实现bind/call/apply
自己手动用原生实现bind/call/apply:https://www.cnblogs.com/LHLVS/p/10595784.html
- 极*Java速成教程 - (5)
Java语言基础 容器 这个世界是有序的,将Java对象零散地放到内存中是不符合世界常理的,特别是有一大组相似的甚至不知道有多少数据的时候.把Java对象装进盒子里可以有序收纳,这个盒子就叫容器. 初 ...
- 【JZOJ 3909】Idiot 的乘幂
题面: 正文: 把题目中的方程组组合在一起就变成了: \(X^{a+c}\equiv b \cdot d (\mod p)\) 那这时,我们假定两个数\(x\)和\(y\),使得: \(ax + cy ...
- golang 一个字符串表达式替换的函数
package util import ( "fmt" "reflect" "regexp" "strconv" &qu ...
- go & flag
参考 Golang下的flag模块使用 Go基础篇[第6篇]: 内置库模块 flag
- 在Python中使用protobuf2.6.1 string format utf-8 and unicode error
版本信息: protobuf: v2.6.1 python: 2.7 关于在Python中使用protobuf时 string格式字段的编码问题 在python中编码格式多采用utf-8格式.而pro ...
- 【学习总结】快速上手Linux玩转典型应用-第4章-准备工作
课程目录链接 快速上手Linux玩转典型应用-目录 目录 1. 准备工作一 2. 准备工作二 ===================================================== ...
- http参数传递方式
url传参 这种在各种method(get,post,delete,put)都能使用,解析速度快 body体中的参数 application/x-www-form-urlencoded 这应该是最常见 ...