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), ...
随机推荐
- Codeforces 1150D(字符串dp)
反思 三维的dp压根没看出来,看题解以后思路又很直观,找几道字符串dp练练才行 序列自动机和优化一维略 /* __ __ * ____| |_____| |____ * | | * | __ | * ...
- mybatis中实现一对一,一对多查询
在实际的开发中我们经常用到的是一对一查询和一对多查询.而多对多的实现是通过中间来实现,这里就没有给出来了 比如: 订单和用户是一对一的关系(一个订单只能对应一个用户) 订单和订单明细是一对多的关系(一 ...
- ecshop二次开发之视频上传
1.前台展示效果: 2.后台展示效果: 3.代码实现: 后台实现过程: 1.在languages/zh_cn/admin/goods.PHP中插入 $_LANG['tab_video'] = '视频上 ...
- css中用一张背景图做页面的技术有什么优势?
css中用一张背景图做页面的技术有什么优势? 简单介绍一下 CSS Sprites 的优点: 当用户往U盘中拷200张图片,会等很久.但是如果弄成一个文件,再拷贝就会快很多. CSS Sprites ...
- Direct2D 第3篇 绘制文字
原文:Direct2D 第3篇 绘制文字 #include <windows.h> #include <d2d1.h> #include <d2d1helper.h> ...
- Leetcode762.Prime Number of Set Bits in Binary Representation二进制表示中质数个计算置位
给定两个整数 L 和 R ,找到闭区间 [L, R] 范围内,计算置位位数为质数的整数个数. (注意,计算置位代表二进制表示中1的个数.例如 21 的二进制表示 10101 有 3 个计算置位.还有, ...
- span元素和div元素的浮动效果
首先看一段代码: <style> #right {margin: 10px;float:right;color:red;} #left {float:left;color:blue;} & ...
- ESP8266 支持浮点运算吗?
ESP8266 支持浮点运算吗? 可以说支持,也可以说不支持. 说不支持的原因是因为 ESP8266 内部没有 FPU,无法使用硬件计算. 说支持的意思是可以使用软件进行浮点运算,但是会很慢很慢,如果 ...
- Ubuntu里node命令无效解决方法
在ubuntu里用sudo apt-get install nodejs安装Node.js后, 会发现terminals里运行node命令(比如node –-version)时候会有No such f ...
- JavaScript实现,控制一个文本框只能输入正整数,如输入不符合条件则文本框全部字体标红
腾讯2014年研发职位笔试题Web前端方向简单题第一题. 代码: <html> <head> <title>test JavaScript</title> ...