codeforces1253F(图转换为树减少复杂度)
题意:
给定一个无向图,其中1-k为充电桩,然后给定q个询问\(u_i, v_i\)(都是充电桩),然后问从其中一个充电桩到达另外一个充电桩需要最小的电池的容量。
每经过一条边都需要消耗一定的能量,到达另外一个充电桩会自动的把电充好。
题解
首先计算每个非充电桩的点到充电桩的最短距离
然后对于每一条边u-v,我们计算他们到各自的充电桩的最短距离+边权重,然后把u'-v',dis_u+dis_v+w加到新的图中
然后就是并查集,注意合并是有序的
最后查询利不断的向上就能进行查询了。
代码
#include<bits/stdc++.h>
#define mp std::make_pair
using namespace std;
typedef long long LL;
typedef std::pair<int,int> pi;
const int N=100005;
const LL inf=(LL)1e15;
int n,m,k,q,cnt,last[N],fro[N],f[N],sz[N];
LL dis[N],val[N];
struct edge{int to,next;LL w;}e[N*6];
struct data{int x,y;LL w;}a[N*3];
std::priority_queue<std::pair<LL,int> > que;
bool vis[N];
void addedge(int u,int v,LL w)
{
e[++cnt].to=v;e[cnt].w=w;e[cnt].next=last[u];last[u]=cnt;
e[++cnt].to=u;e[cnt].w=w;e[cnt].next=last[v];last[v]=cnt;
}
void dij()
{
for (int i=1;i<=k;i++) dis[i]=0,fro[i]=i,que.push(mp(0,i));
for (int i=k+1;i<=n;i++) dis[i]=inf;
while (!que.empty())
{
int u=que.top().second;que.pop();
if (vis[u]) continue;
vis[u]=1;
for (int i=last[u];i;i=e[i].next)
if (dis[u]+e[i].w<dis[e[i].to])
{
dis[e[i].to]=dis[u]+e[i].w;
fro[e[i].to]=fro[u];
que.push(mp(-dis[e[i].to],e[i].to));
}
}
}
bool cmp(data a,data b)
{
return a.w<b.w;
}
//没有进行路径的压缩
int find(int x)
{
return f[x]==x?x:find(f[x]);
}
LL query(int x,int y)
{
LL ans=0;
while (x!=y)
{
if (sz[x]>sz[y]) std::swap(x,y);
ans=std::max(ans,val[x]);x=f[x];
}
return ans;
}
int main()
{
scanf("%d%d%d%d",&n,&m,&k,&q);
for (int i=1;i<=m;i++)
{
int x,y;LL w;scanf("%d%d%lld",&x,&y,&w);
addedge(x,y,w);
}
dij();
for (int i=1;i<=cnt;i+=2)
{
int x=e[i].to,y=e[i+1].to;LL w=dis[x]+dis[y]+e[i].w;
//fro[i] i最短路要经过哪个电桩
a[i/2+1]=(data){fro[x],fro[y],w};
}
std::sort(a+1,a+m+1,cmp);
for (int i=1;i<=k;i++) f[i]=i,sz[i]=1;
//有点最小生成树的感觉。
for (int i=1;i<=m;i++)
{
cout<<a[i].x<<" "<<a[i].y<<" "<<a[i].w<<endl;
int x=find(a[i].x),y=find(a[i].y);
if (x==y) continue;
cout<<"test "<<x<<" "<<y<<endl;
if (sz[x]>sz[y]) std::swap(x,y);
f[x]=y;sz[y]+=sz[x];val[x]=a[i].w;
}
while (q--)
{
int x,y;scanf("%d%d",&x,&y);
printf("%lld\n",query(x,y));
}
return 0;
}
/*
9 11 3 2
1 3 99
1 4 5
4 5 3
5 6 3
6 4 11
6 7 21
7 2 6
7 8 4
8 9 3
9 2 57
9 3 2
3 1
2 3
*/
codeforces1253F(图转换为树减少复杂度)的更多相关文章
- 【BZOJ5211】[ZJOI2018]线图(树哈希,动态规划)
[BZOJ5211][ZJOI2018]线图(树哈希,动态规划) 题面 BZOJ 洛谷 题解 吉老师的题目是真的神仙啊. 去年去现场这题似乎骗了\(20\)分就滚粗了? 首先\(k=2\)直接算\(k ...
- Android-将RGB彩色图转换为灰度图
package com.example.yanlei.wifi; import android.graphics.Bitmap; import android.graphics.BitmapFacto ...
- c语言实现灰度图转换为二值图
将上篇得到的灰度图转换为二值图,读取像素数据,低于某一值置0,否则设置为255,为得到更好的效果不同图片应采用不同的值 /* 2015年6月2日11:16:22 灰度图转换为二值图 blog:http ...
- 在Bootstrap开发框架的前端视图中使用@RenderPage实现页面内容模块化的隔离,减少复杂度
在很多开发的场景中,很多情况下我们需要考虑抽象.以及模块化等方面的内容,其目的就是为了使得开发的时候关注的变化内容更加少一些,整体开发更加简单化,从而减少开发的复杂度,在Winform开发的时候,往往 ...
- HDU-1232 畅通工程 (并查集、判断图中树的棵数)
Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相 ...
- 字符串 --- KMP Eentend-Kmp 自动机 trie图 trie树 后缀树 后缀数组
涉及到字符串的问题,无外乎这样一些算法和数据结构:自动机 KMP算法 Extend-KMP 后缀树 后缀数组 trie树 trie图及其应用.当然这些都是比较高级的数据结构和算法,而这里面最常用和最熟 ...
- 【ZJOI 2018】线图(树的枚举,hash,dp)
线图 题目描述 九条可怜是一个热爱出题的女孩子. 今天可怜想要出一道和图论相关的题.在一张无向图 $G$ 上,我们可以对它进行一些非常有趣的变换,比如说对偶,又或者说取补.这样的操作往往可以赋予一些传 ...
- 字节真题 ZJ26-异或:使用字典树减少计算次数
原题链接 题目描述: 个人分析:从输入数据看,要处理的元素个数(n)没有到达 10^9 或 10^8 级,或许可以使用暴力?但是稍微计算一下,有 10^5 * (10^5 - 1) / 2 = 10^ ...
- [LeetCode] Graph Valid Tree 图验证树
Given n nodes labeled from 0 to n - 1 and a list of undirected edges (each edge is a pair of nodes), ...
随机推荐
- day37 06-Hibernate二级缓存:更新时间戳区
二级缓存区:类缓存区,集合缓存区,更新时间戳区. 它会记录一个时间T1.其实在我们查询之后它会记录一个时间.假设时间叫做T1.就是你查询完之后的当前时间是T1.当我们自己手动在下面做了一个更新之后,它 ...
- 利用SQL查询扶贫对象医保报销比率的审计方法
利用SQL查询扶贫对象医保报销比率的审计方法 扶贫资金惠及贫困百姓的切身利益,主管部门多,资金实行逐级下拨,并且扶贫项目小而分散,主要在乡镇和农村实施.根据湖北省审计厅关于2017年扶贫审计工作方案的 ...
- C#和JS交互 WebBrowser实例
本文实现了WebBrowser的简单例子 1.引用System.Windows.Froms.dll 2.引用WindowsFormsIntegration.dll 代码如下: public parti ...
- awk notes
字符串拼接 cat sql | awk '{print " ALTER TABLE tableA ALTER " $1 " TYPE " $2 " ...
- 【风马一族_Android】无线连接|调试Android手机
原文来自:http://www.cnblogs.com/sows/p/6269396.html (博客园的)风马一族 侵犯版本,后果自负 2017-01-10 15:03:31 准备阶段 1. 软 ...
- bnd -buildpath指令的用法
-buildpath的作用是为项目添加运行时依赖.这个依赖可以是workspace中的另一个项目或者是仓库中的另一个bundle. -buildpath指令只会在编译和构建时起作用,它从来不会被用来运 ...
- 【祈福】NOIP战后占卜:众星陨落,天命难违
Day1 加上看题,做完第一题之后我已经只剩两个小时半了. 然后凭着一定要做完第一题和第二题的坚定信念. 我耗到了只剩一个小时半,结果正解还是没想出来. 其实我从只剩两小时的时候,就有了打第二题的暴力 ...
- nodeJs学习-17 博客案例
源码:智能社视频20节课件 const express=require('express'); const static=require('express-static'); const cookie ...
- Failed to delete access_log
重复build 关闭已经开启的tomcat terminal 再次开启即可
- PHPCMS快速建站系列之phpcms v9 模板标签说明整理
[摘要]本文介绍phpcms v9中模板标签使用说明. {template "content","header"} 调用根目录下phpcms\template\ ...