ZJOI2012 网络——LCT相关题目
有一个无向图G,每个点有个权值,每条边有一个颜色。这个无向图满足以下两个条件:
对于任意节点连出去的边中,相同颜色的边不超过两条。
- 图中不存在同色的环,同色的环指相同颜色的边构成的环。
在这个图上,你要支持以下三种操作:
修改一个节点的权值。
修改一条边的颜色。
- 查询由颜色c的边构成的图中,所有可能在节点u到节点v之间的简单路径上的节点的权值的最大值。
https://daniu.luogu.org/problem/show?pid=2173
-by luogu
对每个颜色建LCT,对error1数组记录,对error2LCT判联通性,对NO Such...直接写了hash,trie树大概开不下;
发现封装起来非常好;
代码:
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,c,p;
struct dt{
int fa,ch[],mark,max,num;
};
struct LCT{
dt data[];
int tot;
void Init(){
data[].fa=data[].mark=data[].max=data[].max=data[].num=;
tot=;
}
void link(int x,int y){
make_root(x);data[x].fa=y;
}
void cut(int x,int y){
make_root(x),access(y),splay(y);
data[x].fa=data[y].ch[]=;
up(y);
}
void access(int x){
int y=;
while(x){
splay(x);
data[x].ch[]=y;
up(x);
y=x;x=data[x].fa;
}
}
void make_root(int x){
access(x);splay(x);data[x].mark^=;
}
int find_root(int x){
access(x);splay(x);
while(data[x].ch[])
x=data[x].ch[];
return x;
}
void splay(int x){
push(x);
int fa,fafa;
for(fa=data[x].fa;data[fa].ch[]==x||data[fa].ch[]==x;roll(x),fa=data[x].fa){
fafa=data[fa].fa;
if(data[fafa].ch[]==fa||data[fafa].ch[]==fa)
if((data[fa].ch[]==x)^(data[fafa].ch[]==fa))
roll(x);
else
roll(fa);
}
}
void roll(int now){
int fa=data[now].fa,fafa=data[fa].fa,wh=data[fa].ch[]==now;
data[fa].ch[wh]=data[now].ch[wh^];data[data[fa].ch[wh]].fa=fa;
data[now].ch[wh^]=fa;data[fa].fa=now;
data[now].fa=fafa;
if (data[fafa].ch[]==fa||data[fafa].ch[]==fa)
data[fafa].ch[data[fafa].ch[]==fa]=now;
up(fa);up(now);
}
void push(int x){
int fa=data[x].fa;
if(data[fa].ch[]==x||data[fa].ch[]==x)
push(fa);
down(x);
}
void up(int x){
int a=data[data[x].ch[]].max>data[data[x].ch[]].max?data[data[x].ch[]].max:data[data[x].ch[]].max;
data[x].max=data[x].num>a?data[x].num:a;
}
void down(int x){
int i;
if(data[x].mark){
i=data[x].ch[],data[x].ch[]=data[x].ch[],data[x].ch[]=i;
data[x].mark=;
data[data[x].ch[]].mark^=;data[data[x].ch[]].mark^=;
}
}
};
int Hash(int ,int ,int );
LCT lct[];
int col[][];
int hash[];
int poll[],next[],colway[],tot;
int main()
{
int i,j,k,u,v,w;
scanf("%d%d%d%d",&n,&m,&c,&p);
for(j=;j<c;j++)lct[j].Init();
for(i=;i<=n;i++){
scanf("%d",&k);
for(j=;j<c;j++)
lct[j].data[i].num=lct[j].data[i].max=k;
}
for(i=;i<=m;i++){
scanf("%d%d%d",&u,&v,&w);
lct[w].link(u,v);
col[u][w]++;col[v][w]++;
Hash(u*+v,,w),Hash(v*+u,,w);
}
for(i=;i<=p;i++){
scanf("%d",&j);
if(j==){
scanf("%d%d",&u,&v);
for(k=;k<c;k++){
lct[k].splay(u);
lct[k].data[u].num=v;
lct[k].up(u);
}
continue;
}
if(j==){
int lk;
scanf("%d%d%d",&u,&v,&k);
lk=Hash(u*+v,,-);
if(!lk){
printf("No such edge.\n");continue;
}
if(--lk==k){
printf("Success.\n");continue;
}
if(col[u][k]==||col[v][k]==){
printf("Error 1.\n");continue;
}
lct[k].make_root(u);
if(lct[k].find_root(v)==u){
printf("Error 2.\n");continue;
}
lct[lk].cut(u,v);
lct[k].link(u,v);
col[u][lk]--;col[v][lk]--;col[u][k]++;col[v][k]++;
Hash(u*+v,,k);Hash(v*+u,,k);
printf("Success.\n");continue;
}
if(j==){
scanf("%d%d%d",&k,&u,&v);
lct[k].make_root(u);
if(lct[k].find_root(v)!=u){
printf("-1\n");continue;
}
lct[k].access(v);
lct[k].splay(v);
printf("%d\n",lct[k].data[v].max);
continue;
}
}
return ;
}
int Hash(int sum,int p,int color){
int mod=,x=sum%mod,i;
if(!hash[x]){
if(!p)return ;
hash[x]=++tot;
poll[tot]=sum;colway[tot]=color;
}
else{
i=hash[x];
while(next[i]&&poll[i]!=sum)
i=next[i];
if(p){
next[i]=++tot;
poll[tot]=sum;
colway[tot]=color;
return ;
}
if(poll[i]!=sum)return ;
if(color==-)return colway[i]+;
colway[i]=color;
}
return ;
}
ZJOI2012 网络——LCT相关题目的更多相关文章
- bzoj 2816: [ZJOI2012]网络 (LCT 建多棵树)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=2816 题面: http://www.lydsy.com/JudgeOnline/upload ...
- BZOJ.2816.[ZJOI2012]网络(LCT)
题目链接 BZOJ 洛谷 对每种颜色维护一个LCT,保存点之间的连接关系. 修改权值A[x]和所有Max[x]都要改: 修改边的颜色先枚举所有颜色,看是否在某种颜色中有边,然后断开.(枚举一遍就行啊 ...
- Luogu 2173 [ZJOI2012]网络 - LCT
Solution $LCT$ 直接上$QuQ$ 注意$cut$ 完 需要 $d[u + c * N]--$ 再 $link$, 不然会输出Error 1的哦 Code #include<cs ...
- BZOJ2816:[ZJOI2012]网络(LCT)
Description 有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环,同色的环指相同颜色的边构 ...
- luoguP2173 [ZJOI2012]网络 LCT
链接 luogu 思路 颜色很少,开10个lct分别维护 if (Hash.count(make_pair(u, v)) && Hash[make_pair(u, v)] == col ...
- 洛谷 P2173 [ZJOI2012]网络 解题报告
P2173 [ZJOI2012]网络 题目描述 有一个无向图G,每个点有个权值,每条边有一个颜色.这个无向图满足以下两个条件: 对于任意节点连出去的边中,相同颜色的边不超过两条. 图中不存在同色的环, ...
- linux网络配置相关命令、虚拟网络接口eth0:0
网络接口(interface)是网络硬件设备在操作系统中的表示方法,比如网卡在Linux操作系统中用ethX,是由0开始的正整数,比如eth0.eth1...... ethX.而普通猫和ADSL的接口 ...
- Linux网络配置相关
路由相关 #添加到主机的路由 route add -host 192.168.1.2 dev eth0 route add -host 192.168.1.2 gw 192.168.1.1 注1:添加 ...
- linux网络配置相关文件
网络接口(interface)是网络硬件设备在操作系统中的表示方法,比如网卡在Linux操作系统中用ethX,是由0开始的正整数,比如eth0.eth1...... ethX.而普通猫和ADSL的接口 ...
随机推荐
- 使用Docker构建jdk1.8镜像
一.下载centos镜像 下载自己需要的版本TAG,详见: docker安装指定版本TAG的镜像 $ sudo docker pull centos:centos7 二.下载jdk1.8,并上传到/u ...
- 【面向对象】【prototype&&__proto__&&实例化对象三者之间的关系】
1.构造函数 a.什么是构造函数? 解释:通过关键字new 创建的函数叫做构造函数 作用:用来创建一个对象 废话少说直接上代码,首先我们还是创建一个构造函数人类 然后我们在创建两个实例,一个凡尘 一个 ...
- Android Fragment向另一个Activity传值
1.Fragment内: Intent intent=new Intent(getActivity(),ShowDataActivity.class); //参数1:Fragment所依存的Activ ...
- LARTC
大牛的博客 howto ,however, is simplify. another space ip link list ip address show ip route show route -n ...
- Pycharm 报错 AttributeError: module 'pip' has no attribute 'main'
1.打开文件packaging_tool.py: D:\Program files\pycharm\PyCharm 2016.3.2\helpers\packaging_tool.py 2.添加导入: ...
- Mac下关闭Sublime Text 3的更新检查
操作如下: 注意:update_check的属性前后都要有一个逗号. , "update_check":false, 然后还需要一步,就是注册破解,在[Help]->[Ent ...
- h2数据库的简单使用
1.登录H2数据库的WebConsole控制台 2.设置数据库连接 3.连接测试通过之后,点击[连接]按钮,登录到test数据库的webConsole 4.创建表 复制H2数据库提供的样例SQL脚本, ...
- SpringBoot集成WebSocket【基于STOMP协议】进行点对点[一对一]和广播[一对多]实时推送
原文详细地址,有点对点,还有广播的推送:https://blog.csdn.net/ouyzc/article/details/79884688 下面是自己处理的一些小bug 参考原文demo,结合工 ...
- 《Algorithms算法》笔记:元素排序(1)——简单排序
<Algorithms算法>元素排序(1)——简单排序 Algorithms算法元素排序1简单排序 排序问题 1 回调函数 2Java中回调函数的路线图 3 全序 4 Comparable ...
- OpenLdap与BerkeleyDB安装过程
前段时间在看LDAP方面的东西,最近重装了Ubuntu之后开始在自己的机器上装一个OpenLDAP. 装的过程中还遇到不少问题,不过通过Google同学的帮忙,全部得到解决.下面装安装过程记录如下: ...