ZOJ 3789 并查集

点击打开链接

题意:只说那几个操作把,L将u与v连接,若u左旋,则v右旋,不会出现不合法的条件,Q问u与v的关系,若已知的条件不能判断在则Unknown,旋转方向不一样则Different,一样则Same,然后还有个查询S,问当前u所在的集合的元素个数,D则为删除,但删除后不改变集合其它元素的关系

思路:这题的方向我们可以用到根节点距离来表示,而距离的统计可以直接在路径压缩时完成,元素个数在合并时也可以完成,有点不好想的是这个删除的操作的办法,因为在删除时有可能就将根节点删除了,那么我们可以在找一个数来代替要删除的这个数,而之前的根节点保持不动就行了,加一个数组保存即可

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int inf=0x3f3f3f3f;
const ll INF=0x3f3f3f3f3f3f3f3fll;
const int maxn=1000010;
int f[maxn],dis[maxn],num[maxn],ff[maxn];
int find1(int x){
    if(x==f[x]) return f[x];
    int t=f[x];
    f[x]=find1(f[x]);
    dis[x]+=dis[t];
    return f[x];
}
void unite(int a,int b){
    int aa=find1(a);
    int bb=find1(b);
    if(aa==bb) return ;
    f[aa]=bb;
    num[bb]+=num[aa];
    dis[a]=dis[b]+1;
}
int main(){
    int n,m,u,v;
    char ch[10];
    while(scanf("%d%d",&n,&m)!=-1){
        for(int i=0;i<=maxn;i++){
            f[i]=ff[i]=i;dis[i]=0;num[i]=1;
        }
        for(int i=0;i<m;i++){
            scanf("%s",ch);
            if(ch[0]=='L'){
                scanf("%d%d",&u,&v);
                unite(ff[u],ff[v]);
            }else if(ch[0]=='Q'){
                scanf("%d%d",&u,&v);
                if(find1(ff[u])!=find1(ff[v])) printf("Unknown\n");
                else if(dis[ff[u]]%2==dis[ff[v]]%2) printf("Same\n");
                else printf("Different\n");
            }else if(ch[0]=='S'){
                scanf("%d",&u);
                int ans=find1(ff[u]);
                printf("%d\n",num[ans]);
            }else if(ch[0]=='D'){
                scanf("%d",&u);
                int ans=find1(ff[u]);
                num[ans]--;
                ff[u]=++n;
                num[n]=1;f[n]=n;dis[n]=0;
            }
        }
    }
    return 0;
}
时间: 2024-11-05 09:33:38

ZOJ 3789 并查集的相关文章

zoj 3659 并查集

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4882 现在在牡丹江,明天regional现场赛,不出一个月就要退役了,求保佑 今天热身赛做题很紧张,老是打错字,所以晚上写写代码练练手 脑子还是不好使,没想到可以并查集 思路:题目中的操作导致的一个结果是,一条边会成为一个集合的w,----  如果能想到这里可能就能想到并查集吧 WA了因为如果father[x]==x并不能表示x中只有一个数啊... #include <cst

2012长春站B题 zoj 3656 并查集

好像大神都用的是2-sat,其实我也有想过.因为我碰到过的判断yes or no的题目就那么几种(2-sat,并查集,搜索,博弈),(因为本人比较水,所以就碰到了这几种,看来以后还是要多做体检积累经验:)),但是比赛的时候还是用了并查集,下面是我的并查集解法: 把b[][]数组上的每个位拆开成两个点i和i',(不超过32位),另外新加两个点0和1,如果确定某点i对应的是0,则i与0点合并,i'点与1点合并:如果确定某点i对应的是1,则i与1合并,i'与0合并:如果确定两点i和j对应的位是相反的数

ZOJ Problem Set - 3321 并查集

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3321 Circle Time Limit: 1 Second      Memory Limit: 32768 KB Your task is so easy. I will give you an undirected graph, and you just need to tell me whether the graph is just a circle.

ZOJ 2833-Friendship(并查集+优化)

Friendship Time Limit: 3 Seconds      Memory Limit: 32768 KB A friend is like a flower, a rose to be exact, Or maybe like a brand new gate that never comes unlatched. A friend is like an owl, both beautiful and wise. Or perhaps a friend is like a gho

zoj 3659 Conquer a New Region 并查集+贪心

点击打开链接题目链接 Conquer a New Region Time Limit: 5 Seconds      Memory Limit: 32768 KB The wheel of the history rolling forward, our king conquered a new region in a distant continent. There are N towns (numbered from 1 to N) in this region connected by s

HDU 1116 || POJ 1386 || ZOJ 2016 Play on Words (欧拉回路+并查集)

题目链接 题意 : 有很多门,每个门上有很多磁盘,每个盘上一个单词,必须重新排列磁盘使得每个单词的第一个字母与前一个单词的最后一个字母相同.给你一组单词问能不能排成上述形式. 思路 :把每个单词看成有首字母指向尾字母的有向边,每个字母看成一个点,题中要求等效于判断图中是否存在一条路径经过每一条一次且仅一次,就是有向欧拉通路.统计个顶点的出入度,如果每个点的出入度都相同,那就是欧拉回路,如果有两个奇数度,那就是欧拉通路,除此之外,都不能满足要求.还有别忘了判断是否连通,此时用到并查集,图中所有的边

Welcome Party ZOJ - 4109 (思维+并查集)

题目链接: Welcome Party  ZOJ - 4109 题目大意:给你T组测试样例,然后n个人,m个关系,每一个关系包括两个人,这两个人为好朋友,然后问你怎么安排顺序,使得整个队伍的友情损失度最小(当一个人放置时,如果他的前面中没有他的朋友,那么整个队伍的朋友损失度就会加1) 具体思路:首先用并查集求出每一个联通块,然后用一个超级汇点连向这些连通块的根,然后优先队列+bfs求出字典序最小的正解就可以了. AC代码: 1 #include<bits/stdc++.h> 2 using n

ZOJ 3811 Untrusted Patrol【并查集】

题目大意:给一个无向图,有些点有装监视器记录第一次到达该点的位置,问是否存在一条路径使得监视器以给定的顺序响起,并且经过所有点 思路:牡丹江网络赛的题,当时想了种并查集的做法,通神写完程序WA了几发,此时JYB用BFS秒了,索性最后还是调出来了,今天自己写了下,感觉唯一的坑点就是需要遍历完所有的点 //zoj3811 #include <stdio.h> #include <string.h> #include <algorithm> #include <queu

ZOJ 3811 / 2014 牡丹江赛区网络赛 C. Untrusted Patrol bfs/dfs/并查集

Untrusted Patrol Time Limit: 3 Seconds                                     Memory Limit: 65536 KB Edward is a rich man. He owns a large factory for health drink production. As a matter of course, there is a large warehouse in the factory. To ensure t