本题算法:最短路树

这是个啥玩意呢,就是对于一个图,构造一棵树,使从源点开始的单源最短路径与原图一模一样。怎么做呢,跑一边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题解的更多相关文章

  1. USACO19JAN Gold题解

    噩梦的回忆.. 上周日在机房打的模拟赛,结果十分惨烈,就最后一题yy出了正解结果玄学的只拿了80 考试结果:0+0+80=80 订正时对着T3打了2hours结果还是90 订正结果:100+100+9 ...

  2. Luogu P5201 [USACO19JAN]Shortcut 最短路树???

    最短路树...开眼界了...之前想也没想过.... 先跑出来1到每个点最短路,然后建树时要标记点的入度,否则会多连边...然后深搜时更新新答案就是 #include<cstdio> #in ...

  3. LuoguP5201 [USACO19JAN]Shortcut(最短路树)

    字典序?建树时从小枚举,用\(Dijkstra\)的血泪建好树,\(size\)大小决定贡献 #include <iostream> #include <cstdio> #in ...

  4. USACO比赛题泛刷

    随时可能弃坑. 因为不知道最近要刷啥所以就决定刷下usaco. 优先级排在学习新算法和打比赛之后. 仅有一句话题解.难一点的可能有代码. 优先级是Gold>Silver.Platinum刷不动. ...

  5. 20190922 「HZOJ NOIP2019 Round #7」20190922模拟

    综述 这次是USACO2019JAN Gold的题目. \(\mathrm{Cow Poetry}\) 题解 因为每句诗的长度一定是\(k\),所以自然而然想到背包. 设\(opt[i][j]\)代表 ...

  6. 树状数组 || 线段树 || Luogu P5200 [USACO19JAN]Sleepy Cow Sorting

    题面:P5200 [USACO19JAN]Sleepy Cow Sorting 题解: 最小操作次数(记为k)即为将序列倒着找第一个P[i]>P[i+1]的下标,然后将序列分成三部分:前缀部分( ...

  7. P5204 [USACO19JAN]Train Tracking 2

    P5204 [USACO19JAN]Train Tracking 2 毒毒题,对着嘤文题解看了贼久 首先考虑此题的一个弱化版本:如果输入的所有\(c_i\)相等怎么做 现在假设有\(len\)个数,取 ...

  8. LG5201 「USACO2019JAN」Shortcut 最短路树

    \(\mathrm{Shortcut}\) 问题描述 LG5201 题解 最短路树. 显然奶牛的路径就是从\(1\)走到各个草地,于是从\(1\)跑最短路,构建最短路树. 为了保证字典序,从\(1\) ...

  9. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

随机推荐

  1. python string_1

    quote :http://www.runoob.com/python/python-strings.html #coding:utf-8 s1="http://www.jnshu.com/ ...

  2. 【Linux开发】Ubuntu图形界面切换与磁盘扩展分区

    Ubuntu14.04设置字符界面快捷键:ctrl-alt-f1 切换回图形界面:ctrl-alt-f7 为虚拟机拓展了30G的空间,挂在了/mnt/sda3这个目录下: 说明一下Ubuntu14.0 ...

  3. 使用powershell管理Docker Toolbox

    打开PowerShell,输入: docker-machine ls 我们可以看到我们当前的Docker虚拟机的状态.如果什么都没有的话,那么我们可以使用以下命令创建一个Docker虚拟机. dock ...

  4. Java String == && equal

    [.net超级群:27921837] Java中equals和==的区别 java中的数据类型,可分为两类:1.基本数据类型,也称原始数据类型.byte,short,char,int,long,flo ...

  5. SVN的各种符号含义,svn的星号,感叹号,问号等含义

    黄色感叹号(有冲突):--这是有冲突了,冲突就是说你对某个文件进行了修改,别人也对这个文件进行了修改,别人抢在你提交之前先提交了,这时你再提交就会被提示发生冲突,而不允许你提交,防止你的提交覆盖了别人 ...

  6. centos 7 无网络情况下,解决yum 安装依赖rpm包

    方法一:在一台有网络的机器,用yum下载好所需程序,传到另外一台网络的机器上安装 yum install xtrabackup --downloadonly --downloaddir=/rpmpat ...

  7. P1540翻译机器

    这是2010提高组第一题,是一个使用队列的模拟题(然而洛谷很多大佬用了最短路) 这道题首先要判断内存中是否已有解释(因为题目已经说了长度很小,所以可以用桶排序),没有的话便去外存找,找到后,存到内存的 ...

  8. 最大连续和 Medium

    Given a two-dimensional array of positive and negative integers, a sub-rectangle is any contiguous s ...

  9. HNUSTOJ-1638 遍地桔子(贪心)

    1638: 遍地桔子 时间限制: 1 Sec  内存限制: 128 MB提交: 711  解决: 134[提交][状态][讨论版] 题目描述 为了实验室的发展,队长决定在实验室外面的空地种桔子树.空地 ...

  10. A广搜

    <span style="color:#330099;">/* A - 广搜 基础 Time Limit:2000MS Memory Limit:65536KB 64b ...