题意:

给定一个无向图,其中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. git命令移动文件夹到另一文件夹

  2. JavaScript--jquery.min.js文件

    /*! jQuery v1.12.3 | (c) jQuery Foundation | jquery.org/license */ !function(a,b){"object" ...

  3. HR招聘_(一)_招聘意识

    最近接触到一点HR的工作,贯穿始终,故有点心得,与众人分享.言辞不尽之处,万望指点一二.不胜感激. HR招聘_(一)_招聘意识HR招聘_(二)_招聘方法论(招聘原因及原则) HR招聘_(三)_招聘方法 ...

  4. PHP配置环境中开启GD库

    下配置好的PHP环境中,GD库不像windows那样可以直接用,而是默认关闭,需要把它打开,去到php.ini文件中 找到php_gd2.dll把分号去掉即可.(注:GD库跟绘制二维码等有关)

  5. AndroidStudio离线打包MUI

    1.下载5+SKD http://ask.dcloud.net.cn/article/103 2.解压到任意目录 3.导入HBuilder-Hello项目 4.在AndroidManifest.xml ...

  6. 【JZOJ5064】【GDOI2017第二轮模拟day2】友好城市 Kosarajo算法+bitset+ST表+分块

    题面 在Byteland 一共有n 座城市,编号依次为1 到n,这些城市之间通过m 条单向公路连接. 对于两座不同的城市a 和b,如果a 能通过这些单向道路直接或间接到达b,且b 也能如此到达a,那么 ...

  7. AJAX之再升级版PJAX

    前几天在一个大神群里提到ajax优化选项卡功能的方法上,有位低调的大神默默得打出:了解一下pjax,好奇心的驱使下,我具体查了一下pjax,不一般啊,ax结合pushState和ajax技术, 不需要 ...

  8. python 对位运算

  9. Hibernate的映射机制是怎样?

    Hibernate的映射机制对象关系映射(Object Relation Mapping(ORM))是一种为了解决面向对象与面向关系数据库互不匹配现象的技术,简而言之ORM是通过使用描述对象之间映射的 ...

  10. 如何在Liferay 7中用html显示页面

    liferay portlet默认的显示页面是view.jsp,虽然可以在jsp中用include标签包括html文件,但是如何直接通过修改配置文件让默认的显示页面为view.html呢? 1.用Li ...