[题解](最短路(树))luogu_P5201_short cut
一开始想着最短路时统计一下到每个点的牛数量,但是没写出来
建最短路树是个不错的想法,正常跑一次最短路,枚举每个点的前驱,如果d[y]==d[x]+w就是树上的一条边,优先连编号小的,
建好树以后做一次dfs,枚举一下每个点的贡献取个最大值即可
#include<bits/stdc++.h>
#define mp make_pair
#define ll long long
using namespace std;
const int maxn=;
const int maxm=;
int n,m,t;ll ans;
priority_queue<pair<ll,int> >q;
struct node{
int v,w,nxt;
}e[maxm*],e2[maxm*];
ll d[maxn],c[maxn],w[maxn];
bool v[maxn];
int head[maxn],cnt;
void add(int u,int v,int w){e[++cnt].v=v;e[cnt].w=w;e[cnt].nxt=head[u];head[u]=cnt;}
int head2[maxn],cnt2;
void add2(int u,int v,int w){e2[++cnt2].v=v;e2[cnt2].w=w;e2[cnt2].nxt=head2[u];head2[u]=cnt2;}
ll max(ll a,ll b){return a<b?b:a;}
void dij(){
memset(d,0x3f,sizeof(d));
d[]=;q.push(mp(,));
while(!q.empty()){
int x=q.top().second;q.pop();
if(v[x])continue;v[x]=;
for(int i=head[x];i;i=e[i].nxt){
int y=e[i].v,z=e[i].w;
if(d[y]>d[x]+z){
d[y]=d[x]+z;
q.push(mp(-d[y],y));
}
}
}
}
void dfs(int x){
v[x]=;
for(int i=head2[x];i;i=e2[i].nxt){
int y=e2[i].v;
if(v[y])continue;
dfs(y);w[x]+=w[y];
}
ans=max(ans,(ll)w[x]*(d[x]-t));
}
int main(){
scanf("%d%d%d",&n,&m,&t);
for(int i=;i<=n;i++)scanf("%lld",&w[i]);
for(int i=,u,v,w;i<=m;i++){
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);add(v,u,w);
}
dij();
//建最短路树
memset(v,,sizeof(v));
for(int i=;i<=n;i++){
for(int j=head[i];j;j=e[j].nxt){
int y=e[j].v,z=e[j].w;
if(d[y]==d[i]+z && !v[y])
v[y]=,add2(i,y,z),add2(y,i,z);
}
}
memset(v,,sizeof(v));
dfs();
printf("%lld",ans);
}
[题解](最短路(树))luogu_P5201_short cut的更多相关文章
- [JZOJ5279]香港记者题解--最短路图
[JZOJ5279]香港记者题解--最短路图 题目链接 过 于 暴 力 分析 有一个naiive的想法就是从1到n跑最短路,中途建图,然后在图上按字典序最小走一遍,然而·这是不行的,你这样跳不一定能跳 ...
- Bzoj 3694: 最短路 树链剖分
3694: 最短路 Time Limit: 5 Sec Memory Limit: 256 MBSubmit: 67 Solved: 34[Submit][Status][Discuss] Des ...
- 【题解】SDOI2017树点涂色
LCT强强!以前总是觉得LCT非常的难懂(当然现在也是的),但实际上它真的是很厉害的一种东西.它是一种动态的链剖分结构,其实就是对于剖分出来的重链使用LCT去进行维护.cut 与 link 两个操作让 ...
- HDU 4871 Shortest-path tree 最短路 + 树分治
题意: 输入一个带权的无向连通图 定义以顶点\(u\)为根的最短路生成树为: 树上任何点\(v\)到\(u\)的距离都是原图最短的,如果有多条最短路,取字典序最小的那条. 然后询问生成树上恰好包含\( ...
- 题解【[BJOI2015]树的同构】
切了省选题+紫题,来写个题解 这题其实挺水,才120行代码 该题写了我一天(上午1.5h,晚上10min = 一天) hash,对于节点A,\[hashval[A] = \{hashval[i]\ti ...
- 【CF115E】Linear Kingdom Races 题解(线段树优化DP)
前言:前辈讲课时设的状态还是有些繁琐,感觉题解设的状态更简洁. -------------- 题目链接 题目大意:给定$n$条道路和$m$场比赛,每个道路修建需要$c_i$,每场比赛需要使用$[l_i ...
- P2023 [AHOI2009]维护序列 题解(线段树)
题目链接 P2023 [AHOI2009]维护序列 解题思路 线段树板子.不难,但是...有坑.坑有多深?一页\(WA\). 由于乘法可能乘\(k=0\),我这种做法可能会使结果产生负数.于是就有了这 ...
- [火星补锅] 水题大战Vol.2 T1 && luogu P1904 天际线 题解 (线段树)
前言: 当时考场上并没有想出来...后来也是看了题解才明白 解析: 大家(除了我)都知道,奇点和偶点会成对出现,而出现的前提就是建筑的高度突然发生变化.(这个性质挺重要的,我之前没看出来) 所以就可以 ...
- 动态树(Link Cut Tree) :SPOJ 375 Query on a tree
QTREE - Query on a tree #number-theory You are given a tree (an acyclic undirected connected graph) ...
随机推荐
- 提取html的正文
1 using System; 2 using System.Text; 3 namespace HtmlStrip 4 { 5 class MainClass 6 { 7 ...
- android:Android中用文件初始化sqlite数据库
很多时候在应用安装初始化时,需要创建本地数据库,同时为数据库添加数据,之后再从数据库中读取数据. 这里有2个思路 1.先在本地创建一个能支持android使用的sqlite数据库文件,启动时,用现成的 ...
- 新版ycsb运行mapkeeper成功
bin/ycsb load mapkeeper -P workloads/workloada 首先,按照上面一个帖子将mapkeeper的jar包进行mvn安装,修改ycsb主目录和mapkeeper ...
- 精选Java面试题
什么是隐式类型转换?什么是显示类型转换? 当将占位数少的类型赋值给占位数多的类型时,Java自动使用隐式类型转换(如int型转为long型).当把在级别高的变量的值赋给级别底变量时,必须使用显示类型转 ...
- gitblit安装使用
1.下载地址 http://www.gitblit.com/ 2.安装jdk(自行安装) 3.解压gitblit # tar -zxvf gitblit-1.8.0.tar.gz 4.配置# cd g ...
- Notepad++安装xml插件
环境: win7 64位 Notepad++7.3.3 原生的Notepad++不自带xml文件的插件,所以在显示xml文件时并不分行(如下图所示),对于用户编辑,查看的操作而言,并不友好,所以需要安 ...
- jni中c代码调用java代码
原理是使用反射的机制 java中反射的例子: Class<?> forName = Class.forName("com.example.ndkcallback.DataProv ...
- python逼格提升
1.合并可以匹配的条件 s1 = 7 if s1 > 5 and s1 < 10: print(s1) s1 = 7 if 5 < s1 < 10: print(s1) 2.i ...
- CreateEx
virtual BOOL CreateEx( DWORD dwExStyle, LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle ...
- Python学习资源汇总
Python 简明教程 (入门必看) * 在线浏览: http://woodpecker.org.cn/abyteofpython_cn/chinese/ Python Tutorial 简体中文版 ...