雪之国度有N座城市,依次编号为1到N,又有M条道路连接了其中的城市,每一条道路都连接了不同的2个城市,任何两座不同的城市之间可能不止一条道路。
  雪之女王赋予了每一座城市不同的能量,其中第i座城市被赋予的能量为Wi。
  如果城市u和v之间有一条道路,那么只要此刻雪之女王的能量不小于|Wu-Wv|,这条道路就是安全的。
  如果城市u和v之间存在两条没有重复道路的安全路径(其中每一段道路都是安全的),则认为这两座城市之间有着良好的贸易关系。
  最近,雪之女王因为情感问题,她的能量产生巨大的波动。为了维持雪之国度的经济贸易,她希望你能帮忙对Q对城市进行调查。
  对于第j对城市uj和vj,她希望知道在保证这两座城市之间有着良好贸易关系的前提之下,自己最少需要保持多少的能量。
 Input
  每一组数据第一行有3个整数,依次为N,M,Q,表示城市个数,道路个数,和所需要进行的调查次数。
  之后一行,有N个整数,依次为每一个城市被赋予的能量Wi。
  之后M行,每一行有2个整数,表示对应编号的两个城市之间有一条道路。
  之后Q行,每一行有2个整数,表示一组调查的城市目标。
  对于100%的数据来说,3<=N<=100000, 3<=M<=500000, 1<=Q<=100000, 每一座城市的能量Wi满足0<=Wi<=200000.
 Output
  输出一共有Q行,依次对应Q次调查的结果。
  其中第j行给出了第j次调查的结果,即雪之女王需要保持的最少能量值。如果永远也无法做到,输出"infinitely"。

  就是要使俩城市在同个边双连通分量,问这个边双最大边权的最小值。

  先把最小生成树跑出来,然后把没用到的边按照边权从小到大加进去,每次可能会形成一个环,就把那个环缩成一个点。这个过程的同时搞一棵新的树,新树上每个点代表一个边双,缩点的时候就在新树里建一个新点,新的点往环上的所有点连边,边权为环上的最大边权。

  那么对于每个查询的点对(a,b),答案其实就是两个点在新树上路径的最大边权(两个点在新树上的lca代表的边双就是最优的了)。

  具体实现就是倍增来倍增去的....

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstdlib>
#include<bitset>
//#include<ctime>
#define ll long long
#define ull unsigned long long
#define ui unsigned int
#define d double
#define ld long double
using namespace std;
const int maxn=;
struct zs{int x,y,dis;bool used;}a[maxn];
struct zs1{int too,pre,dis;}e[maxn<<];int tot,last[maxn];
int too[maxn],pre[maxn],la[maxn],tt;
int FA[][],_FA[][],MX[][],_MX[][];
int id[maxn],cnt,dep[maxn],_dep[maxn],_RT[maxn],RT,fa[maxn],top[maxn],v[maxn],_V[maxn];
int i,j,k,n,m;
bool u[maxn]; int ra;char rx;
inline int read(){
rx=getchar(),ra=;
while(rx<'')rx=getchar();
while(rx>='')ra=ra*+rx-,rx=getchar();return ra;
} bool operator <(zs a,zs b){return a.dis<b.dis;}
inline int getfa(int x){return fa[x]!=x?fa[x]=getfa(fa[x]):x;}
inline int gettop(int x){return top[x]!=x?top[x]=gettop(top[x]):x;}
inline int abs(int x){return x<?-x:x;} inline void insert(int a,int b,int c){
e[++tot].too=b,e[tot].dis=c,e[tot].pre=last[a],last[a]=tot,
e[++tot].too=a,e[tot].dis=c,e[tot].pre=last[b],last[b]=tot;
}
inline void ins(int a,int b){too[++tt]=b,pre[tt]=la[a],la[a]=tt;/*printf("link:%d-->%d\n",a,b);*/}
inline int max(int a,int b){return a>b?a:b;}
inline void maxs(int &a,int b){if(b>a)a=b;}
void dfs(int x){
int to,i;dep[x]=dep[FA[x][]]+,u[x]=;
for(i=;i<;i++)FA[x][i]=FA[FA[x][i-]][i-],MX[x][i]=max(MX[x][i-],MX[FA[x][i-]][i-]);
for(i=last[x];i;i=e[i].pre)if(!u[to=e[i].too])
FA[to][]=x,MX[to][]=e[i].dis,dfs(to);
}
inline int getmx(int x,int y){
int mx=,i;//printf(" getmx:%d %d\n",x,y);
if(dep[x]<dep[y])swap(x,y);
for(i=;i>=;i--)if(dep[FA[x][i]]>=dep[y])maxs(mx,MX[x][i]),x=FA[x][i];
if(x!=y){
for(i=;i>=;i--)if(FA[x][i]!=FA[y][i])maxs(mx,MX[x][i]),maxs(mx,MX[y][i]),x=FA[x][i],y=FA[y][i];
maxs(mx,MX[x][]),maxs(mx,MX[y][]);
}//printf("lca:%d\n",FA[x][0]);
return mx;
} void _dfs(int x){
int i;_dep[x]=_dep[_FA[x][]]+,_RT[x]=RT,u[x]=;
for(i=;i<;i++)_FA[x][i]=_FA[_FA[x][i-]][i-],_MX[x][i]=max(_MX[x][i-],_MX[_FA[x][i-]][i-]);
for(i=la[x];i;i=pre[i])
_FA[too[i]][]=x,_MX[too[i]][]=_V[x],_dfs(too[i]);
}
inline int _getmx(int x,int y){
int mx=,i;
if(_dep[x]<_dep[y])swap(x,y);
for(i=;i>=;i--)if(_dep[_FA[x][i]]>=_dep[y])maxs(mx,_MX[x][i]),x=_FA[x][i];
if(x!=y){
for(i=;i>=;i--)if(_FA[x][i]!=_FA[y][i])maxs(mx,_MX[x][i]),maxs(mx,_MX[y][i]),x=_FA[x][i],y=_FA[y][i];
maxs(mx,_MX[x][]),maxs(mx,_MX[y][]);
}return mx;//_FA[x][0]>0?mx:-1;
}
int main(){
n=read(),m=read();int q=read();
for(i=;i<=n;i++)v[i]=read(),fa[i]=i;
for(i=;i<=m;i++)a[i].x=read(),a[i].y=read(),a[i].dis=abs(v[a[i].x]-v[a[i].y]);
std::sort(a+,a++m); int x,y,tmp;
for(i=;i<=m;i++)if((x=getfa(a[i].x))!=(y=getfa(a[i].y)))
fa[x]=y,insert(a[i].x,a[i].y,a[i].dis),a[i].used=;//,printf("%d--%d %d\n",a[i].x,a[i].y,a[i].dis);
for(i=;i<=n;i++)if(!u[i])dfs(i);
// for(i=1;i<=n;i++)printf("i:%d FA:%d\n",i,FA[i][0]);
// return 233;
int cnt=n;
for(i=;i<=n;i++)id[i]=top[i]=i;
for(i=;i<=m;i++)if(!a[i].used&&((x=gettop(a[i].x)))!=(y=gettop(a[i].y))){
// printf(" %d %d %d x:%d y:%d\n",a[i].x,a[i].y,a[i].dis,x,y);
_V[++cnt]=max(a[i].dis,getmx(a[i].x,a[i].y));//printf(" _V:%d\n",_V[cnt]);
while(x!=y){
if(dep[x]<dep[y])swap(x,y);
ins(cnt,id[x]),//printf("link:%d-->%d\n",cnt,id[x]),
top[x]=gettop(FA[x][]),x=top[x];//printf(" %d %d\n",x,y);
}ins(cnt,id[x]),id[x]=cnt;
}
memset(u+,,cnt);
for(i=cnt;i;i--)if(!u[i])RT=i,_dfs(i); while(q--){
x=read(),y=read();
if(_RT[x]!=_RT[y])puts("infinitely");//else
// if((tmp=_getmx(x,y))==-1)puts("infinitely");
else printf("%d\n",/*tmp*/_getmx(x,y));
}
}

[51nod1743]雪之国度的更多相关文章

  1. 【JZOJ4899】【NOIP2016提高A组集训第17场11.16】雪之国度

    题目描述 雪之国度有N座城市,依次编号为1到N,又有M条道路连接了其中的城市,每一条道路都连接了不同的2个城市,任何两座不同的城市之间可能不止一条道路.雪之女王赋予了每一座城市不同的能量,其中第i座城 ...

  2. [JZOJ4899] 雪之国度

    题目描述 雪之国度有N座城市,依次编号为1到N,又有M条道路连接了其中的城市,每一条道路都连接了不同的2个城市,任何两座不同的城市之间可能不止一条道路.雪之女王赋予了每一座城市不同的能量,其中第i座城 ...

  3. 【51nod1743】雪之国度(最小生成树+倍增)

    点此看题面 大致题意: 给你一张无向连通图,其中每条边的边权为这条边连接的两点的权值之差.每次询问两点之间是否存在两条不重复的路径,若存在则输出这两条路径上最大值的最小值. 大致思路 这题显然就是要让 ...

  4. 【HHHOJ】NOIP2018 模拟赛(二十五) 解题报告

    点此进入比赛 得分: \(100+100+20=220\)(\(T1\)打了两个小时,以至于\(T3\)没时间打了,无奈交暴力) 排名: \(Rank\ 8\) \(Rating\):\(+19\) ...

  5. NOIP2018赛前停课集训记(10.24~11.08)

    前言 为了不久之后的\(NOIP2018\),我们的停课从今天(\(Oct\ 24th\))起正式开始了. 本来说要下周开始的,没想到竟提早了几天,真是一个惊喜.毕竟明天有语文考试.后天有科学考试,逃 ...

  6. 用FSM一键制作逐帧动画雪碧图 Vue2 + webpack

    因为工作需要要将五六十张逐帧图拼成雪碧图,网上想找到一件制作工具半天没有找到,就自己用canvas写了一个. 写成之后就再没有什么机会使用了,因此希望有人使用的时候如果遇到bug了能及时反馈给我. 最 ...

  7. 将MPM雪模拟移植到Maya

    同事实现了一个迪士尼的MPM雪模拟论文,我将其移植到Maya中 论文题目是 A material point method for snow simulation 代码在这里: https://git ...

  8. BZOJ 1006 【HNOI2008】 神奇的国度

    题目链接:神奇的国度 一篇论文题--神奇的弦图,神奇的MCS-- 感觉我没有什么需要多说的,这里简单介绍一下MCS: 我们给每个点记录一个权值,从后往前依次确定完美消除序列中的点,每次选择权值最大的一 ...

  9. 原创:CSS3技术-雪碧图自适应缩放与精灵动画方案

    花了一个礼拜完成了慕课网定制的七夕主题效果,其中有一个没实现好的功能,就是雪碧图的自适应缩放 ps: 以下实现都是基于移动端的处理 原图如下: 人物是采用的是雪碧图,通过坐标绝对数据取值 问题很明显, ...

随机推荐

  1. SQL Server 数据库引擎怎样记录完整备份后修改过的数据

    SQL Server 使用两个内部数据结构跟踪被大容量复制操作修改的区,以及自上次完整备份后修改的区.这些数据结构极大地加快了差异备份的速度.当数据库使用大容量日志恢复模式时,这些数据结构也可以加快将 ...

  2. [数据结构]C语言栈的实现

    有始有终,所以我准备把各种数据结构都讲一次,栈也分顺序存储和链式储存,这里我们选择链式存储来讲,顺序存储没有难度(链式其实也是) 作为数据结构中最简单的栈,这里不会说太多,首先考虑一下下面的model ...

  3. C# TreeView 控件的综合使用方法

    1.概述 该篇文章开发使用的语言c#,环境visualstudio2010,sql数据库.主要内容包括: (1)treeView控件添加根节点.子节点的基本方法,节点的删除. (2)把treeView ...

  4. 视觉SLAM

    SLAM:Simultaneous Localization And Mapping.中文:同时定位与地图重建. 它是指搭载特定传感器的主体,在没有实验先验信息的情况下,于运动过程中建立环境的模型,同 ...

  5. [C#]使用Redis来存储键值对(Key-Value Pair)

    本文为原创文章.源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称.作者及网址,谢谢! 开发工具:VS2017 语言:C# DotNet版本:.Net FrameWork 4.5及以 ...

  6. PHP判断手机号运营商(详细介绍附代码)

    道理很简单,知道手机号规则 进行正则判断就可以 移动:134.135.136.137.138.139.150.151.157(TD).158.159.187.188 联通:130.131.132.15 ...

  7. Windows 7下将Tomcat Java程序设置为Windows Service

    可以参看以下资料: https://jingyan.baidu.com/article/b2c186c89f5127c46ef6ff08.html http://tomcat.apache.org/t ...

  8. MySQL 最左前缀(Leftmost Prefix) & 组合索引(复合索引,多列索引)

    资料来源于网络,仅供参考学习. CREATE TABLE test(a INT,b INT,c INT,KEY idx(a,b,c)); 优: SELECT * FROM test WHERE a=1 ...

  9. 让 kibana 后台启动的方案

    为了解决启动kibana后关闭shell终端kibana自动关闭的问题,记录2种解决方案,试验后均可行. 假设kibana安装的目录为 /usr/local/kibana/ 方案一: 使用nohup ...

  10. Paho -物联网 MQTT C Cient的实现和详解

    概述   在文章Paho - MQTT C Cient的实现中,我介绍了如何使用Paho开源项目创建MQTTClient_pulish客户端.但只是简单的介绍了使用方法,而且客户端的结果与之前介绍的并 ...