COGS 2075. [ZLXOI2015][异次元圣战III]ZLX的陨落

article/2025/4/30 23:59:05

★★☆   输入文件:ThefallingofZLX.in   输出文件:ThefallingofZLX.out   简单对比
时间限制:1 s   内存限制:256 MB

【题目描述】

正当革命如火如荼,情侣教会日薄西山之时,SOX和FFF的分歧却越来越大,SOX认为情侣教会不合适的、无限制的秀恩爱和阶级歧视值得反对,而FFF认为一切情侣都该从这个世界上消失。

SOX先发制人,率先接管了全国政权并突袭了FFF,暗杀了FFF的首领,FFF的红色革命事业遭到了空前的打击,一些FFF团员积极抵抗,另一些FFF团员隐居避世,而一些FFF团员则走向极端,参加了一个邪恶组织:诅咒教会

你虽然对SOX下山摘桃子的行为不满,但你对邪教更不满。在对诅咒教会的长期调查中,你发现该组织的操纵者是亡灵巫师ZLX!现在,维护正义的使命降到了你身上!你和其他的一些远征军将士前往ZLX的城堡,却掉入了ZLX的魔法陷阱--扭曲虚空,扭曲虚空由n个魔法结界空间组成,m条虚空隧道连接着它们,你和其他的远征军将士(恰好有n个)分散在魔法结界空间里,只有会合在一起,你们才能冲破封锁(扭曲虚空是一颗树)。现在,你向平行世界的你提出了疑问,如果给出两个人会合,总共至少需要多少魔法能量?

已知虚空隧道的长度与消耗的魔法能量在数值上相等。

ZLX的末日已经到临,等到你冲出虚空隧道,亲手结果了ZLX吧!

【输入格式】

第一行一个正整数N,代表魔法结界空间的个数,一个正整数M,代表虚空隧道的个数

接下来M行,每行三个数u,v,w,代表虚空隧道连接的两个点和虚空隧道的长度

接下来一个正整数Q,代表查询个数

接下来Q行,每行两个数u,v代表询问从uv需要消耗的魔法能量

【输出格式】

Q行,每行一个正整数

【样例输入】

6 5

1 2 7

1 3 3

2 4 5

3 5 7

4 6 6

5

3 4

6 3

5 1

4 3

4 2

【样例输出】

15

21

10

15

5

【提示】

对于20%的数据,n<=300,q<=300

对于40%的数据,n<=2000,q<=2000

对于100%的数据,n<=100000,q<=100000,w<=32767m=n1

 

 

果lca求两点距离

屠龙宝刀点击就送

tarjan法rank1 

#include <cstdio>
#include <vector>
#include <cctype>
#define N 100005
inline void read(int &x)
{register char ch=getchar();for(x=0;!isdigit(ch);ch=getchar());for(;isdigit(ch);x=x*10+ch-'0',ch=getchar());
}
using namespace std;
vector<int>vec[N];
int n,m,q,y,cnt,to[N<<1],head[N<<1],nextt[N<<1],u[N],v[N],dad[N],fa[N],ans[N],val[N],DIS[N<<1];
int find_(int x) {return x==fa[x]?x:fa[x]=find_(fa[x]);}
void Dfs(int x)
{fa[x]=x;for(register int i=head[x];i;i=nextt[i]){int v=to[i];if(v==dad[x]) continue;dad[v]=x;val[v]=DIS[i]+val[x];Dfs(v);}for(register int i=0;i<vec[x].size();++i) if(dad[y=x^u[vec[x][i]]^v[vec[x][i]]]) ans[vec[x][i]]=find_(y);fa[x]=dad[x];
}
int Main()
{freopen("ThefallingofZLX.in","r",stdin);freopen("ThefallingofZLX.out","w",stdout);read(n); read(m);for(int U,V,W;m--;){read(U); read(V); read(W);nextt[++cnt]=head[U];to[cnt]=V;DIS[cnt]=W;head[U]=cnt;nextt[++cnt]=head[V];to[cnt]=U;DIS[cnt]=W;head[V]=cnt;}read(q);for(register int i=1;i<=q;++i){read(u[i]); read(v[i]);vec[u[i]].push_back(i);vec[v[i]].push_back(i);  }Dfs(1);for(register int i=1;i<=q;++i) printf("%d\n",val[u[i]]+val[v[i]]-2*val[ans[i]]);return 0;
}
int sb=Main();
int main(int argc,char *argv[]) {;}
View Code

倍增

#include <cstdio>
#define N 100005
int n,m,q,cnt,to[N<<1],head[N<<1],nextt[N<<1],dep[N],dad[N][25],val[N],DIS[N<<1];
void Dfs(int x)
{dep[x]=dep[dad[x][0]]+1;for(int i=0;dad[x][i];++i) dad[x][i+1]=dad[dad[x][i]][i];for(int i=head[x];i;i=nextt[i]){int v=to[i];if(v==dad[x][0]) continue;dad[v][0]=x;val[v]=DIS[i]+val[x];Dfs(v);}
}
inline void swap(int &m,int &n)
{int tmp=n;n=m;m=tmp;
}
inline int lca(int x,int y)
{if(dep[x]>dep[y]) swap(x,y);for(int i=20;i>=0;--i)if(dep[dad[y][i]]>=dep[x])y=dad[y][i];if(x==y) return x;for(int i=20;i>=0;--i)if(dad[y][i]!=dad[x][i])y=dad[y][i],x=dad[x][i];return dad[x][0];
}
int main(int argc,char *argv[])
{freopen("ThefallingofZLX.in","r",stdin);freopen("ThefallingofZLX.out","w",stdout);scanf("%d%d",&n,&m);for(int u,v,w;m--;){scanf("%d%d%d",&u,&v,&w);nextt[++cnt]=head[u];to[cnt]=v;DIS[cnt]=w;head[u]=cnt;nextt[++cnt]=head[v];to[cnt]=u;DIS[cnt]=w;head[v]=cnt;}Dfs(1);scanf("%d",&q);for(int u,v;q--;){scanf("%d%d",&u,&v);int Lca=lca(u,v);printf("%d\n",val[u]+val[v]-2*val[Lca]);}return 0;
}

 

转载于:https://www.cnblogs.com/ruojisun/p/7738683.html


http://chatgpt.dhexx.cn/article/R7cAu7pW.shtml

相关文章

Codechef GRAPHCNT 支配树学习及tarjan算法求解

[Codechef GRAPHCNT]新年的有向图 【题目描述】 zlx同学在学习数论时,被虐了一脸,丧心病狂的他决定去报复社会。 zlx在公园里埋下N颗地雷,用来炸飞在春节期间秀恩爱的情侣。这N颗地雷由M条有向边连接成为一个有向图,zlx则在1号地雷处引爆1号地雷可以到达的地雷。现在,为了…

大数据体系建设经验分享

分享嘉宾&#xff1a;吴荣彬 分贝通 大数据部负责人 编辑整理&#xff1a;zlx 出品平台&#xff1a;DataFunTalk 导读&#xff1a;本文将介绍分贝通在大数据领域的一些建设经验。分贝通在ToB领域是一个年轻的公司&#xff0c;成立六年多&#xff0c;大数据体系刚刚建立一年多&a…

将二维数组转为稀疏数组进行压缩,提高效率

** 稀疏数组 ** ##基本介绍&#xff1a; 当一个数组中大部分元素为&#xff10;&#xff0c;或者为同一个值的数组时&#xff0c;可以使用稀疏数组来保存该数组。 稀疏数组的处理方法是: 1) 记录数组一共有几行几列&#xff0c;有多少个不同的值 2) 把具有不同值的元素的行列…

A数字三角 怨种

问题描述 有一天&#xff0c;无聊的 zlx 从 1 开始数数&#xff0c;同时在纸上写下每个数的个位数字。因为她非常热爱直角三角形&#xff0c;所以在纸上写下的数字按照直角三角形排列。现在告 诉你写她了 N 行数字&#xff0c;要求你打出这些数字。 输入格式 一行一个数 N&a…

聊聊Spring的IOC,AOP、DI、MVC

1 聊聊Ioc,Di,Mvc,Aop 不想看下面内容的&#xff0c;直接上代码连接&#xff0c;以下代码都有注释 传送门 1.1 看启动项 我们先来看看启动项 package com.tian;import com.tian.springframework.annotation.SpringBootApplication; import com.tian.springframework.config…

ZYNQ DDS产生载波FFT变换

环境&#xff1a;vivado2017.4&#xff0c;快速傅里叶变换V9.0 IP核 一&#xff0c;介绍&#xff1a;Xilinx FFT IP核是一种计算DFT的有效方式。 特点&#xff1a;前向变换&#xff08;FFT&#xff09;和反向变换&#xff08;IFFT&#xff09;在复数空间&#xff0c;并且可…

并发队列中迭代器弱一致性原理探究

一、前言 并发队列里面的Iterators是弱一致性的&#xff0c;next返回的是队列某一个时间点或者创建迭代器时候的状态的反映。当创建迭代器后&#xff0c;其他线程删除了该元素时候并不会抛出java.util.ConcurrentModificationException异常&#xff0c;能够保持创建迭代器后的元…

浅谈同构类问题的骗分算法

ZLX算法-----同构类问题的有力骗分算法前言&#xff1a;ZLX算法是一种解决判定性同构问题的蒙特卡罗式骗分算法&#xff1a;总能在确定的运行时间内出解&#xff0c;但是得到的解不能保证正确。尽管由于具有拓扑序&#xff0c;树同构和仙人掌同构存在多项式算法&#xff0c;但是…

win10下修改C盘用户文件夹名

之前安装一个程序出错&#xff0c;上网百度后是用户文件夹名为中文&#xff0c;也在网上找了好多方法&#xff0c;有同步的&#xff0c;有修改注册表的&#xff0c;最后我找到一个比较简单而且数据保留完整的方法。这种方法也会自动修改用户的环境变量&#xff0c;不过修改完后…

【Windows】Win10-更改c盘下的用户文件夹名

转载ooooohugh的文章&#xff0c;原文地址&#xff1a;https://blog.csdn.net/qq_33530388/article/details/71739845 当初 不小心用自己名字 作为计算机用户名&#xff0c;后来 许多软件因为 不支持 路径中有中文&#xff0c;导致吃了不少的亏&#xff0c;心疼。。。。 下面说…

Windows10更改c盘中用户名对应的文件名字

目录 前言一、修改步骤1.开启管理员账号并登陆2.重启电脑3.登录管理员账号4.重命名用户名对应的文件夹5.修改Path6.重启电脑并切换回你的账号7.修改环境变量8.重启电脑 二、修改导致的问题1.桌面大部分软件快捷方式失效2.部分软件无故消失 三、提醒Last 前言 强烈建议看完此文…

win10 修改c盘用户文件夹名称

c盘用户文件夹如果是中文名 可能会导致需要没必要的麻烦&#xff0c;记录一下修改方法 第一步&#xff1a;如果你电脑不是本地用户administrator&#xff0c;注销当前用户使用administrator登录 按winx 点击关机或注销 在点击注销 注销后如果没有Administrator登录方式&#…

有关windows10修改C盘用户中文名文件夹相关问题的具体解决方案

win10修改用户文件夹名 今天在下载安卓sdk开发工具的时候&#xff0c;安装出现了一个问题如图&#xff0c;左下角提示我们的sdk路径含有非ascll的字符&#xff0c;无法继续安装&#xff0c;其实不只是中文字符&#xff0c;英文字符中间若有空格也不能继续安装。 对于互联网学…

更改计算机用户文件夹,win10系统怎么自定义C盘用户文件夹名称

许多用户在安装win10系统之后&#xff0c;想要让电脑显得更加个性化&#xff0c;就想要给C盘中的用户文件夹名称进行自定义修改&#xff0c;那么win10系统怎么自定义C盘用户文件夹名称呢&#xff1f;接下来给大家分享一下具体的操作步骤。 1、在键盘上按下Windows键X 组合键&am…

Windows 11 的C盘User(用户)文件夹下的用户文件夹名称的修改

背景介绍&#xff1a;由于系统重装导致Windows 11的系统用户名与C盘User&#xff08;用户&#xff09;文件夹下的用户名文件夹&#xff08;公用文件夹旁边的文件夹&#xff09;出现名称不一致&#xff0c;事例中系统用户名命名为“寂萧”&#xff0c;User&#xff08;用户&…

win10怎么更改c盘用户计算机名,详解win10系统更改c盘用户名文件夹名称的设置技巧...

电脑一旦开机就会不停的运行&#xff0c;不可避免会出现软硬件问题&#xff0c;win10系统更改c盘用户名文件夹名称就是比较常见的状况&#xff0c;尤其是姑娘们遇到win10系统更改c盘用户名文件夹名称是要难过哭鼻子的&#xff0c;其实小编的经验是碰到win10系统更改c盘用户名文…

Windows 10系统中,如何重命名用户文件夹

免责声明 该方法不适用于所有情况&#xff0c;可能导致数据丢失、计算机无法重启等问题&#xff0c;请提前保护好数据&#xff01; 背景 许多Windows用户总是喜欢将文件放在用户文件夹&#xff08;C:\Users\username&#xff09;下&#xff0c;但有时候会发生一些令人苦恼的…

win10修改C盘用户文件夹下的文件命名

唉&#xff01;&#xff01;&#xff01;以前不太懂这些&#xff0c;取了个中文用户名。结果下载软件的过程中&#xff0c;各种出错&#xff0c;就是路径里面含有中文导致的。 这种情况下还都不能直接重命名&#xff0c;我试了各种方法&#xff0c;都不适合&#xff0c;最后找到…

windows修改用户文件夹名称 更改用户名 修改C盘Users目录下文件夹名称

知乎上的更详细版本 windows修改 C:\Users用户文件夹名称 把中文名修改为英文名 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/509804656 简短的说&#xff1a; 1 - 新建一个管理员账户A&#xff08;名称随意&#xff0c;不要和其他账户一样&#xff09;&#xff0c;注销…

win11修改C盘用户文件夹名称

新电脑使用microsoft账号进行初始化&#xff0c;导致用户文件夹名称是邮箱前五位&#xff0c;这个真的让人头痛。网上很多方法是直接改名称、改注册表信息等&#xff0c;导致出问题&#xff0c;结果要重装系统&#xff0c;很麻烦。 其实有一个很好的解决方法&#xff0c;如下&a…