【BZOJ3651】网络通信

Description

有一个由M 条电缆连接的 N 个站点组成的网络。为了防止垄断,由 C 个公司控制所有的电缆,规定任何公司不能控制连接同一个站点的两条以上的电缆(可以控制两条)。同时规定,每个公司不能有多余的电缆,所谓的多余,是指属于同一个公司的电缆不能形成环。  
在运作过程中,不同公司之间会进行电缆买卖。请你写一个程序判断买卖是否合法。

Input

输入第一行有4个由空格隔开的整数 N,M,C和 T。N(1≤N≤ 8 000)表示站点数,M(0≤M≤100 000)表示连接站点的电缆数。C(1≤C≤ 100)表表示公司数量,T 表示电缆买卖次
数。后面有M行,每行三个整数Sj1,Sj2和Kj,表示连接站点Sj1和Sj2(1≤Sj1< Sj2  ≤ n)的电缆属于Kj(1≤Kj≤C)公司拥有,任意两个站点只有一条直接相连的电缆,输入状态合法。最后T(0≤T≤100 000)行,每行三个整数 Si1, Si2和  Ki,表示 Ki公司想购买站点Si1和Si2之间的电缆。

Output

输出共 T行,表示处理的结果,有以下几种可能的结果: 
1、“No such cable.”  两个站点间没有电缆。 
2、 “Already owned.”  电缆己经是 Ki 公司控制。 
3、 “Forbidden: monopoly.” Ki 公司己经控制了两条连接 Si1  或  Si2 的电缆。 
4、 “Forbidden: redundant.” Ki 公司控制的线路会出现环。 
5、 “Sold.”  可以买卖。

Sample Input

4 5 3 5
1 2 1
2 3 1
3 4 2
1 4 2
1 3 3
1 2 3
1 2 3
1 4 3
2 3 3
2 4 3

Sample Output

Sold.
Already owned.
Forbidden: monopoly.
Forbidden: redundant.
No such cable.

题解:LCT模板题。用map维护每条边属于哪个公司,然后将每个点拆成100个(对应属于每个公司的情况),剩下的LCT即可。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
#include <utility>
#define MP(A,B) make_pair(A,B)
#define p(A,B) ((A-1)*n+B)
using namespace std;
const int maxn=100010;
typedef pair<int,int> pii;
struct LCT
{
int ch[2],rev,fa;
}s[maxn<<3];
int n,m,C,T;
map<pii,int> mp;
int d[maxn<<3];
inline bool isr(int x){return s[s[x].fa].ch[0]!=x&&s[s[x].fa].ch[1]!=x;}
inline void pushdown(int x)
{
if(s[x].rev)
{
swap(s[x].ch[0],s[x].ch[1]);
if(s[x].ch[0]) s[s[x].ch[0]].rev^=1;
if(s[x].ch[1]) s[s[x].ch[1]].rev^=1;
s[x].rev=0;
}
}
inline void rotate(int x)
{
int y=s[x].fa,z=s[y].fa,d=(x==s[y].ch[1]);
if(!isr(y)) s[z].ch[y==s[z].ch[1]]=x;
s[x].fa=z,s[y].fa=x,s[y].ch[d]=s[x].ch[d^1];
if(s[x].ch[d^1]) s[s[x].ch[d^1]].fa=y;
s[x].ch[d^1]=y;
}
void updata(int x)
{
if(!isr(x)) updata(s[x].fa);
pushdown(x);
}
inline void splay(int x)
{
updata(x);
while(!isr(x))
{
int y=s[x].fa,z=s[y].fa;
if(!isr(y))
{
if((x==s[y].ch[0])^(y==s[z].ch[0])) rotate(x);
else rotate(y);
}
rotate(x);
}
}
inline void access(int x)
{
for(int y=0;x;splay(x),s[x].ch[1]=y,y=x,x=s[x].fa);
}
inline void maker(int x)
{
access(x),splay(x),s[x].rev^=1;
}
inline void link(int x,int y)
{
maker(x),s[x].fa=y;
}
inline void cut(int x,int y)
{
maker(x),access(y),splay(y),s[y].ch[0]=s[x].fa=0;
}
inline int findr(int x)
{
while(s[x].fa) x=s[x].fa;
return x;
}
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
int main()
{
n=rd(),m=rd(),C=rd(),T=rd();
int i,a,b,c,e;
for(i=1;i<=m;i++)
{
a=rd(),b=rd(),c=rd();
if(a>b) swap(a,b);
mp[MP(a,b)]=c,link(p(c,a),p(c,b)),d[p(c,a)]++,d[p(c,b)]++;
}
for(i=1;i<=T;i++)
{
a=rd(),b=rd(),c=rd(),e=mp[MP(a,b)];
if(a>b) swap(a,b);
if(!e) puts("No such cable.");
else if(e==c) puts("Already owned.");
else if(d[p(c,a)]>=2||d[p(c,b)]>=2) puts("Forbidden: monopoly.");
else if(findr(p(c,a))==findr(p(c,b))) puts("Forbidden: redundant.");
else
{
puts("Sold.");
mp[MP(a,b)]=c,cut(p(e,a),p(e,b)),link(p(c,a),p(c,b)),d[p(e,a)]--,d[p(e,b)]--,d[p(c,a)]++,d[p(c,b)]++;
}
}
return 0;
}
 

【BZOJ3651】网络通信 LCT的更多相关文章

  1. BZOJ3651 : 网络通信

    同[ZJOI2012]网络,把每个点拆成C个点然后用LCT维护. #include<cstdio> #include<map> #define P make_pair #def ...

  2. 【BZOJ-3651&3081】网络通信&StrangeRegulations Link-Cut-Tree

    3651: 网络通信 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 90  Solved: 61[Submit][Status][Discuss] D ...

  3. 一堆LCT板子

    搞了一上午LCT,真是累死了-- 以前总觉得LCT高大上不好学不好打,今天打了几遍感觉还可以嘛= =反正现在的水平应付不太难的LCT题也够用了,就这样好了,接下来专心搞网络流. 话说以前一直YY不出来 ...

  4. 动态树之LCT(link-cut tree)讲解

    动态树是一类要求维护森林的连通性的题的总称,这类问题要求维护某个点到根的某些数据,支持树的切分,合并,以及对子树的某些操作.其中解决这一问题的某些简化版(不包括对子树的操作)的基础数据结构就是LCT( ...

  5. 在此为LCT开一个永久的坑

    其实我连splay都还不怎么会. 今天先抄了黄学长的bzoj2049,以后一定要把它理解了. 写LCT怎么能不%数据结构大神yeweining呢?%%%chrysanthemums  %%%切掉大森林 ...

  6. 【BZOJ2157】旅游 LCT

    模板T,SB的DMoon..其实样例也是中国好样例...一开始不会复制,yangyang:找到“sample input”按住shift,按page down.... #include <ios ...

  7. 【BZOJ3669】[Noi2014]魔法森林 LCT

    终于不是裸的LCT了...然而一开始一眼看上去这是kruskal..不对,题目要求1->n的路径上的每个点的两个最大权值和最小,这样便可以用LCT来维护一个最小生成路(瞎编的...),先以a为关 ...

  8. 【BZOJ1180】: [CROATIAN2009]OTOCI & 2843: 极地旅行社 LCT

    竟然卡了我....忘记在push_down先下传父亲的信息了....还有splay里for():卡了我10min,但是双倍经验还是挺爽的,什么都不用改. 感觉做的全是模板题,太水啦,不能这么水了... ...

  9. 【BZOJ3282】Tree LCT

    1A爽,感觉又对指针重怀信心了呢= =,模板题,注意单点修改时splay就好,其实按吾本意是没写的也A了,不过应该加上能更好维护平衡性. ..还是得加上好= = #include <iostre ...

随机推荐

  1. sass的高级语法

    1. 变量 sass允许使用变量,所有变量以$开头 2.引用父元素 & 这里 "&" 就代表是 a 3.继承 这样  class2 就 拥有了class1的所有属性 ...

  2. Redis缓存清理

    Redis缓存清理 学习了:https://www.cnblogs.com/ZnCl/p/7116870.html 使用 redis-cli.exe登录, 使用flushall 命令: 或者key * ...

  3. 怎样设置gephi可画大规模网络图形

    (1)编辑gephi.conf 文件夹:\etc\gephi.conf 默认512MB.你能够改为22GB,约22528M # ${HOME} will be replaced by user hom ...

  4. php正则表达式基本

    一.正则表达式的组成 1.分隔符,可以是除了字母,数字,反斜线及空白以外的任何字符,比如/,!,#,%,|,~等;通常有/,!,~ 2.表达式:由一些特殊字符和非特殊字符组成. 3.修饰符:用于开启或 ...

  5. 标准库priority_queue的一种实现

    优先级队列相对于普通队列,提供了插队功能,每次最先出队的不是最先入队的元素,而是优先级最高的元素. 它的实现采用了标准库提供的heap算法.该系列算法一共提供了四个函数.使用方式如下: 首先,建立一个 ...

  6. linux下打开、关闭tomcat,实时查看tomcat执行日志

     启动:通常是运行sh tomcat/bin/startup.sh   停止:通常是运行sh tomcat/bin/shutdown.sh脚本命令   查看:运行ps -ef |grep tomc ...

  7. storage事件 js页面间通信

    1.概述 https://developer.mozilla.org/en-US/docs/Web/Events/storage localStorage 或者sessionStorage存储的数据发 ...

  8. Yii 获得当前控制器和方法

    [怎样获得当前控制器和方法] 控制器:$this -> id ; 方法:$this->action->id ; 这主要是用在视图中,进行高亮显示. <div id=" ...

  9. 每天一个JavaScript实例-展示设置和获取CSS样式设置

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  10. http://m2eclipse.sonatype.org/sites/m2e地址更换了

    http://m2eclipse.sonatype.org/sites/m2e 更换为 https://repository.sonatype.org/content/sites/forge-site ...