您的位置:首页 > 理论基础 > 计算机网络

ZJOI2012网络--LCT强化练习

2017-01-21 21:35 295 查看
太强了!!!!!!!!

#include<iostream>
#include<cstdio>
#include<map>
using namespace std;
const int maxn=10005,maxc=10;
#define mp make_pair
int val[maxn];
struct Link_Cut_Tree{
int Max[maxn],fa[maxn],deg[maxn],ch[maxn][2];
bool rev[maxn];
bool is_root(int p){
return (p!=ch[fa[p]][0])&&(p!=ch[fa[p]][1]);
}
void push_up(int p){
Max[p]=val[p];
if(Max[ch[p][0]]>Max[p])Max[p]=Max[ch[p][0]];
if(Max[ch[p][1]]>Max[p])Max[p]=Max[ch[p][1]];
}
void push_down(int p){
if(rev[p]){
rev[p]=0;
rev[ch[p][0]]^=1;
rev[ch[p][1]]^=1;
swap(ch[p][0],ch[p][1]);
}
}
void push(int p){
if(!is_root(p))push(fa[p]);
push_down(p);
}
void rotate(int u,int p,bool k){
if(!is_root(p))
ch[fa[p]][p==ch[fa[p]][1]]=u;
fa[ch[u][k^1]]=p,fa[u]=fa[p],fa[p]=u;
ch[p][k]=ch[u][k^1],ch[u][k^1]=p;
push_up(p);
}
void splay(int u){
push(u);
while(!is_root(u))
rotate(u,fa[u],u==ch[fa[u]][1]);
push_up(u);
}
void access(int u){
int v=0;
while(u){
splay(u);
ch[u][1]=v;
u=fa[v=u];
}
}
void set_root(int u){
access(u),splay(u),rev[u]^=1;
}
void link(int u,int v){
deg[u]++,deg[v]++;
set_root(u),fa[u]=v;
}
void cut(int u,int v){
deg[u]--,deg[v]--;
set_root(u);
access(v),splay(v);
fa[u]=ch[v][0]=0;
}
int find(int u){
while(fa[u])u=fa[u];
return u;
}
int query(int u,int v){
if(find(u)!=find(v))return -1;
set_root(u);
access(v),splay(v);
return Max[v];
}
}T[maxc];
map<pair<int,int>,int>col;
int main(){
int n,m,C,Q;
scanf("%d%d%d%d",&n,&m,&C,&Q);
for(int i=1;i<=n;i++)
scanf("%d",&val[i]);
while(m--){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
col[mp(u,v)]=col[mp(v,u)]=w;
T[w].link(u,v);
}
while(Q--){
int type,u,v,w;
scanf("%d",&type);
if(type==0){
scanf("%d%d",&u,&v),val[u]=v;
for(int i=0;i<C;i++)T[i].splay(u);
}else if(type==1){
scanf("%d%d%d",&u,&v,&w);
if(!col.count(mp(u,v)))puts("No such edge.");
else if(col[mp(u,v)]==w)puts("Success.");
else if((T[w].deg[u]>=2)||(T[w].deg[v]>=2))puts("Error 1.");
else if(T[w].find(u)==T[w].find(v))puts("Error 2.");
else{
puts("Success.");
T[col[mp(u,v)]].cut(u,v);
col[mp(u,v)]=col[mp(v,u)]=w;
T[w].link(u,v);
}
}else{
scanf("%d%d%d",&w,&u,&v);
printf("%d\n",T[w].query(u,v));
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: