poj1703(各种姿势)
题目链接:http://poj.org/problem?id=1703
题意:有n个人分别属于两个团伙,接下来m组形如 ch, x, y的数据,ch为“D"表示 x, y属于不同的团伙,ch为"A"表示询问x,y书否属于同一个团伙;
解法1:我们可以用jion(x, y)属于同一个团伙,jion(x+n, y)表示x属于第二个团伙,y属于第一个团伙,jion(x, y+n)表示x属于第一个团伙,y属于第二个团伙;
那么对于每组不同团伙的x, y我们只需要jion(x+n, y) ,jion(x, y+n)即可;查询时判断x,y或者x+n, y+n根节点是否相同即可,因为集合关系jion表示属于同一团伙,根节点相同则属于相同团伙,若x, y+n,或者x+n, y根节点相同则属于不同团伙,其余情况即为不能确定;
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#define MAXN (100000+10) //***MAXN后面做下标时MAXN*2,要加括号,不然会越界!!run time error!!!
using namespace std; int pre[MAXN*], rank[MAXN*]; //***rank用来区分树的高度,但其不存储树的具体高度 int find(int x){
int r = x;
while(pre[r]!=r){
r = pre[r];
}
int i = x; //****路径压缩
while(pre[i]!=r){
int gg = pre[i];
pre[i] = r;
i = gg;
}
return r;
} void jion(int x, int y){
int xx = find(x);
int yy = find(y);
if(rank[xx]>rank[yy]){ //***启发式合并,就是把矮的树合并到高的树地下,把合并时间从0(n)降到o(logn)
pre[yy] = xx;
}else{
pre[xx] = yy;
if(rank[xx] == rank[yy]){ //**若树的标记高度一样,那么给合并后作为父亲的树rank+1,以区分树的高度
rank[xx]++;
}
}
} int main(void){
int t;
scanf("%d", &t);
while(t--){
int n, m;
scanf("%d%d", &n, &m);
for(int i=; i<=*n; i++){
pre[i] = i;
rank[i] = ;
}
while(m--){
char ch[];
int x, y;
scanf("%s%d%d", ch, &x, &y);
if(ch[]=='D'){
jion(x, y+n);
jion(x+n, y);
}else{
if(find(y+n)==find(x)||find(x+n)==find(y)){
printf("In different gangs.\n");
}else if(find(x)==find(y)||find(x+n)==find(y+n)){
printf("In the same gang.\n");
}else{
printf("Not sure yet.\n");
}
}
}
}
return ;
}
方法2:用vis数组标记不同的集合,如:vis[x]=y,表示与x不同集合的点y;
用并查集合并属于同一类的点集;
代码:
#include <iostream>
#include <stdio.h>
#define MAXN 100010
using namespace std; int pre[MAXN], vis[MAXN], rank[MAXN]; //***vis标记不同集合的编号,rank区分树高
//***vis[x]=y,表示记录x与y不同集合,相当于无向图,所以需双向标记 /*int find(int x){ //**400+ms
int r = x;
while(pre[r]!=r){
r = pre[r];
}
int i = x;
while(i!=r){
int gg = pre[i];
pre[i] = r;
i = gg;
}
return r;
}*/ int find(int x){ //**306ms (再加启发式合并=282ms)
return pre[x]==x ? x : pre[x] = find(pre[x]);
} void jion(int x, int y){
int xx = find(x);
int yy = find(y);
if(rank[xx] > rank[yy]){
pre[yy] = xx;
}else{
pre[xx] = yy;
if(rank[xx] == rank[yy]){
rank[yy]++;
}
}
} int main(void){
int t;
scanf("%d", &t);
while(t--){
int n, m;
scanf("%d%d", &n, &m);
for(int i=; i<=n; i++){
pre[i] = i;
vis[i] = ;
rank[i] = ;
}
while(m--){
char ch[];
int x, y;
scanf("%s%d%d", ch, &x, &y);
if(ch[]=='D'){
if(vis[x]== && vis[y]==){ //**x, y都没出现过
vis[x] = y;
vis[y] = x;
}else if(vis[x]==){ //**x没出现过
vis[x] = y;
jion(x, vis[y]);
}else if(vis[y]==){ //**y没出现过
vis[y] = x;
jion(y, vis[x]);
}else{ //**都出现过
jion(x, vis[y]);
jion(y, vis[x]);
}
}else{
if(find(x)==find(y)){
printf("In the same gang.\n");
}else if(find(x)==find(vis[y])){
printf("In different gangs.\n");
}else{
printf("Not sure yet.\n");
}
}
}
}
return ;
}
方法3:
种类并查集,先区分能不能辨别的情况,然后只要考虑同和不同两种情况,可以用rank数组记录当前节点x与其根节点是否相同的信息,1表相同,0表不同;
代码:
#include <iostream>
#include <stdio.h>
#define MAXN 100010
using namespace std; int pre[MAXN], rank[MAXN]; //**rank储存x与x的根节点是否相同的信息,1表相同,0表不同 int find(int x){
if(x==pre[x]){
return pre[x];
}
int xx = pre[x];
pre[x] = find(pre[x]);
rank[x] = (rank[x] + rank[xx])&; //**压缩路径,x的根节点改变了,rank[x]也要改变
return pre[x];
} void jion(int x, int y){
int xx = find(x);
int yy = find(y);
if(xx!=yy){
pre[yy] = xx;
rank[yy] = (rank[x] + rank[y] + )&; //**合并只需改变yy之前的rank值
}
} int main(void){
int t;
scanf("%d", &t);
while(t--){
int n, m;
scanf("%d%d", &n, &m);
for(int i=; i<=n; i++){
pre[i] = i;
rank[i] = ;
}
while(m--){
char ch[];
int x, y;
scanf("%s%d%d", ch, &x, &y);
if(ch[]=='D'){
jion(x, y);
}else{
if(find(x)==find(y)){
if(rank[x]==rank[y]){
printf("In the same gang.\n");
}else{
printf("In different gangs.\n");
}
}else{
printf("Not sure yet.\n");
}
}
}
}
return ;
}
poj1703(各种姿势)的更多相关文章
- 内网劫持渗透新姿势:MITMf简要指南
声明:本文具有一定攻击性,仅作为技术交流和安全教学之用,不要用在除了搭建环境之外的环境. 0×01 题记 又是一年十月一,想到小伙伴们都纷纷出门旅游,皆有美酒佳人相伴,想到这里,不禁潸然泪下.子曰:& ...
- 判断是否为gif/png图片的正确姿势
判断是否为gif/png图片的正确姿势 1.在能取到图片后缀的前提下 1 2 3 4 5 6 7 8 9 //假设这是一个网络获取的URL NSString *path = @"http:/ ...
- 在Linux(ubuntu server)上面安装NodeJS的正确姿势
上一篇文章,我介绍了 在Windows中安装NodeJS的正确姿势,这一篇,我们继续来看一下在Linux上面安装和配置NodeJS. 为了保持一致,这里也列举三个方法 第一个方法:通过官网下载安装 h ...
- 聊聊 Web 项目二维码生成的最佳姿势
在设计和实现的过程之后,你永远不知道部署上去的程序会已什么样的姿势运行. 本篇借一次生成二维码逻辑的不同实现,阐述 Web 项目中二维码生成的正确姿势. 文中如有批量,欢迎各位看客老爷拍砖.试运行前5 ...
- Lua手动编译姿势
LUA-5.3.3.tar.gz Lua源码+链接2016年5月30日更新 手动编译姿势: 已经装有VS2010 使用VS自带的 cl.exe以及 VS命令簿 打开文件地址 运行自己的bat文件 my ...
- 浅谈OC对象初始化的三种姿势
一.普通程序猿普通程序员使用最常见路人姿势等场.普普通通,纯属陆仁辈. 陆仁贾写法: // view 1 UIView *v1 = [UIView alloc] initWithFrame:CGRec ...
- 与MySQL传统复制相比,GTID有哪些独特的复制姿势?
与MySQL传统复制相比,GTID有哪些独特的复制姿势? http://mp.weixin.qq.com/s/IF1Pld-wGW0q2NiBjMXwfg 陈华军,苏宁云商IT总部资深技术经理,从事数 ...
- 快速了解IOC的几种姿势
一.首先我们了解IOC如何注入的几种姿势 构造函数注入(Constructor Injection) Ioc容器会智能的选择和调用合适的构造函数以创建依赖的对象.如果被选择的构造函数具有相应的参数,I ...
- xpath轴的正确使用姿势
网上看了许多关于轴的介绍,只介绍了语法,而没有明说具体实际中该怎么使用,百思不得其解. 背景--python中使用xpath: ----------------------------------- ...
随机推荐
- php中向mysql插入数据
$sql='insert into news(title,subtitle,source,publishtime,content,image,author) values("'.unico ...
- 怎样用路由器共享需要网页认证的wifi
设置步骤:第一步:登录管理界面 1.连接电脑使用单机能上网的电脑,通过网线连接到路由器的LAN口.2.登录管理界面打开电脑的浏览器,清空地址栏后,输入路由器的管理地址(以路由器底部标贴标识的管理地址为 ...
- 【转】phpcms-v9中关于模型的理解
PHPCMS v9 模型概念 一.什么是模型? 模型是系统知识的抽象表示.我们不能仅仅通过语言来描述一个系统,也不能仅仅通过记忆来记录关于系统的知识.知识是通过某种媒介来表达的,这种媒介所表达的内容就 ...
- 深入理解Java虚拟机之读书笔记一 自动内存管理机制
一.运行时数据区域 1.程序计数器是线程的私有空间,每个线程都有.针对线程执行的是Java代码还是Native代码有两种取值,Java代码时:虚拟机字节码指令的地址:Native代码时:计数值为Und ...
- sizeof和小部分c++语法
ios 中 sizeof(类型) 获取类型所占字节 32位操作系统中, 每个字节占8个位 64位操作系统中, 每个字节占16个位 INT_MAX 2147483647 int size1 = siz ...
- python 循环语句的else语句用法,当循环条件变为假,切不是通过breakbreak终止的时候,就会执行这个else语句。
循环语句可以有一个else子句:当(for)循环迭代完整个列表或(while)循环条件变为假,而非由break语句终止时,就会执行这个else语句.下面循环搜索质数的代码例示了这一点: >> ...
- Android权限 uses-permission
Manifest.permission 官方API说明: http://developer.android.com/reference/android/Manifest.permission.html ...
- [CQOI2011]动态逆序对
(又是一道树套树……自己真是玩疯了……) (题意略) 从网上也看过题解,好像解法很多……比如CDQ+树状数组,树状数组套主席树,树状数组套平衡树……我用的是树状数组套splay. (我会说是因为我不会 ...
- apache开启虚拟主机localhost无法访问
今天在集成环境下配虚拟主机,没想到虚拟主机开启后,localhost竟然无法访问了,解决办法是这样的: 实例一,Apache 配置localhost虚拟主机步骤 1,用记事本打开apache目录下ht ...
- 转帖:如何建立与使用 Window setup project
原文地址: http://www.codeproject.com/Articles/12548/Visual-Studio-Windows-Application-Setup-Project