题意:

给定一个无向图,其中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(图转换为树减少复杂度)的更多相关文章

  1. 【BZOJ5211】[ZJOI2018]线图(树哈希,动态规划)

    [BZOJ5211][ZJOI2018]线图(树哈希,动态规划) 题面 BZOJ 洛谷 题解 吉老师的题目是真的神仙啊. 去年去现场这题似乎骗了\(20\)分就滚粗了? 首先\(k=2\)直接算\(k ...

  2. Android-将RGB彩色图转换为灰度图

    package com.example.yanlei.wifi; import android.graphics.Bitmap; import android.graphics.BitmapFacto ...

  3. c语言实现灰度图转换为二值图

    将上篇得到的灰度图转换为二值图,读取像素数据,低于某一值置0,否则设置为255,为得到更好的效果不同图片应采用不同的值 /* 2015年6月2日11:16:22 灰度图转换为二值图 blog:http ...

  4. 在Bootstrap开发框架的前端视图中使用@RenderPage实现页面内容模块化的隔离,减少复杂度

    在很多开发的场景中,很多情况下我们需要考虑抽象.以及模块化等方面的内容,其目的就是为了使得开发的时候关注的变化内容更加少一些,整体开发更加简单化,从而减少开发的复杂度,在Winform开发的时候,往往 ...

  5. HDU-1232 畅通工程 (并查集、判断图中树的棵数)

    Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相 ...

  6. 字符串 --- KMP Eentend-Kmp 自动机 trie图 trie树 后缀树 后缀数组

    涉及到字符串的问题,无外乎这样一些算法和数据结构:自动机 KMP算法 Extend-KMP 后缀树 后缀数组 trie树 trie图及其应用.当然这些都是比较高级的数据结构和算法,而这里面最常用和最熟 ...

  7. 【ZJOI 2018】线图(树的枚举,hash,dp)

    线图 题目描述 九条可怜是一个热爱出题的女孩子. 今天可怜想要出一道和图论相关的题.在一张无向图 $G$ 上,我们可以对它进行一些非常有趣的变换,比如说对偶,又或者说取补.这样的操作往往可以赋予一些传 ...

  8. 字节真题 ZJ26-异或:使用字典树减少计算次数

    原题链接 题目描述: 个人分析:从输入数据看,要处理的元素个数(n)没有到达 10^9 或 10^8 级,或许可以使用暴力?但是稍微计算一下,有 10^5 * (10^5 - 1) / 2 = 10^ ...

  9. [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), ...

随机推荐

  1. Django项目:CRM(客户关系管理系统)--01--01PerfectCRM基本配置ADMIN01

    一.CRM项目需求 二.CRM项目新建 PerfectCRM crm

  2. Spring使用JDBC配置具名参数

    好处:若有多个参数,则不用再去对应位置?,直接对应参数名,便于维护 缺点:较为麻烦 使用具名参数时可以使用以下的方法 好处,通过实现类BeanPropertySqlParameterSource之间传 ...

  3. 【linux配置】虚拟机配置静态IP地址

    使用VMware配置虚拟机静态IP地址 一.安装好虚拟后在菜单栏选择编辑→ 虚拟网络编辑器,打开虚拟网络编辑器对话框,选择Vmnet8 Net网络连接方式,随意设置子网IP,点击NAT设置页面,查看子 ...

  4. 【GDOI2017 day1】取石子游戏 线段树+区间合并

    题面 如果给你一棵有根树,树根为 1,并且树的每个结点上有一个权值,现在我想知道每个点,除它所在子树以外的结点权值集合的 mex,怎么做呢? 在这里,mex 是定义在集合上的函数,mex(S) 表示 ...

  5. Linux 7.X 网络配置

    Linux 7.X 网络配置 环境: 笔记本中安装了虚拟机,在虚拟机中安装了Redhat 7.4版本的操作系统,现配置该操作系统网络.(IP.网关等) 相关指令如下: # nmcli connecti ...

  6. jQuery ajax请求struts action实现异步刷新

    第一步:导入相关jar包,本样例需导入struts相关jar包,json-lib.jar,gson-2.1.jar可以任意选择,但是这里需要都导入,因为为了做测试,两种jar包的转换方式都用到了. 第 ...

  7. window10下载安装jieba

    下载安装jieba的过程如下: 1 下载jieba 2 将其解压到E:\python2,如图所示: 3 在桌面左下角搜索框中输入"运行",之后输入"cmd".再 ...

  8. 【风马一族_php】

    原文来自:http://www.cnblogs.com/sows/p/6054383.html  (博客园的)风马一族 侵犯版本,后果自负 2016-11-11   15:13:51 回顾 数组:分配 ...

  9. 2019-8-30-C#-从零开始写-SharpDx-应用-笔刷

    title author date CreateTime categories C# 从零开始写 SharpDx 应用 笔刷 lindexi 2019-8-30 8:50:0 +0800 2019-6 ...

  10. python KMP算法介绍