0x41 并查集
太菜了才做到并查集啊啊啊啊啊啊啊啊啊啊啊
还是很有收获的说
水
好题 poj1456 感受到并查集传递性的美妙啊!对于一个商品,去找他过期前那天的集合假如大于0相当于可以在这天卖出,然后这个集合和前一个集合合并!
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std; struct node{int v,d;}a[];
bool cmp(node n1,node n2){return n1.v>n2.v;} int fa[];
int findfa(int x)
{
if(fa[x]==x)return x;
fa[x]=findfa(fa[x]);return fa[x];
} int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=;i<=n;i++)
scanf("%d%d",&a[i].v,&a[i].d);
sort(a+,a+n+,cmp); for(int i=;i<=;i++)fa[i]=i; int ans=;
for(int i=;i<=n;i++)
{
if(findfa(a[i].d)!=)
{
ans+=a[i].v;
int fx=findfa(a[i].d);
int fy=findfa(fx-);
fa[fx]=fy;
}
}
printf("%d\n",ans);
}
return ;
}
poj1456
NOI2002银河英雄传说 这个我没有系统的学“拓展域”和“边带权”,导致写的很挫。。用了奇技淫巧。。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std; char ss[];
int fa[],d[];
int findfa(int x)
{
if(fa[x]<)return x; int dis=d[x];
int f=findfa(fa[x]); d[x]=dis+d[fa[x]];fa[x]=f;
return fa[x]; }
int main()
{
for(int i=;i<=;i++)fa[i]=-i,d[i]=; int Q,x,y;
scanf("%d",&Q);
while(Q--)
{
scanf("%s%d%d",ss+,&x,&y);
if(ss[]=='M')
{
int fx=findfa(x),fy=findfa(y);
int t=fa[fy];
fa[fy]=-fa[fx], d[fy]=;
fa[fx]=t;
}
else
{
int fx=findfa(x),fy=findfa(y);
if(fx!=fy)printf("-1\n");
else printf("%d\n",max(d[x],d[y])-min(d[x],d[y])-);
}
}
return ;
}
NOI2002银河英雄传说
正经的边带权,还是很秀的边带权
poj1182 食物链这题之前搞死人,正经的拓展域~
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std; int fa[];
int findfa(int x)
{
if(x==fa[x])return x;
fa[x]=findfa(fa[x]);return fa[x];
}
int main()
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=;i<=n*;i++)fa[i]=i; int d,x,y,ans=;
for(int i=;i<=k;i++)
{
scanf("%d%d%d",&d,&x,&y);
if(x>n||y>n){ans++;continue;} int fx1=findfa(x),fy1=findfa(y);
int fx2=findfa(x+n),fy2=findfa(y+n);
int fx3=findfa(x+n*),fy3=findfa(y+n*);
if(d==)
{
if(fx1==fy2||fy1==fx2)ans++;
else fa[fx1]=fy1, fa[fx2]=fy2, fa[fx3]=fy3;
}
else
{
if(fx1==fy1||fx1==fy2)ans++;
else fa[fy1]=fx2, fa[fy2]=fx3, fa[fy3]=fx1;
}
}
printf("%d\n",ans);
return ;
}
poj1182
感觉这个博客就是让我存代码的
0x41 并查集的更多相关文章
- 算法竞赛进阶指南0x41并查集
并查集简介 并查集的两类操作: Get 查询任意一个元素是属于哪一个集合. Merge 把两个集合合并在一起. 基本思想:找到代表元. 注意有两种方法: 使用一个固定的值(查询方便,但是在合并的时候需 ...
- BZOJ 4199: [Noi2015]品酒大会 [后缀数组 带权并查集]
4199: [Noi2015]品酒大会 UOJ:http://uoj.ac/problem/131 一年一度的“幻影阁夏日品酒大会”隆重开幕了.大会包含品尝和趣味挑战两个环节,分别向优胜者颁发“首席品 ...
- 关押罪犯 and 食物链(并查集)
题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N.他们之间的关系自然也极不和谐.很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突.我们用"怨气值"( ...
- 图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用
图的连通性问题:无向图的连通分量和生成树,所有顶点均由边连接在一起,但不存在回路的图. 设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图G 时,将边集 E(G) 分成两个集合 T(G) 和 ...
- bzoj1854--并查集
这题有一种神奇的并查集做法. 将每种属性作为一个点,每种装备作为一条边,则可以得到如下结论: 1.如果一个有n个点的连通块有n-1条边,则我们可以满足这个连通块的n-1个点. 2.如果一个有n个点的连 ...
- [bzoj3673][可持久化并查集 by zky] (rope(可持久化数组)+并查集=可持久化并查集)
Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同一集合,是则输出1否则输出0 0& ...
- [bzoj3123][sdoi2013森林] (树上主席树+lca+并查集启发式合并+暴力重构森林)
Description Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数 ...
- 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集
3673: 可持久化并查集 by zky Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 1878 Solved: 846[Submit][Status ...
- Codeforces 731C Socks 并查集
题目:http://codeforces.com/contest/731/problem/C 思路:并查集处理出哪几堆袜子是同一颜色的,对于每堆袜子求出出现最多颜色的次数,用这堆袜子的数目减去该值即为 ...
随机推荐
- BPM使用ligerUI实现主从表显示
先看一下效果图: 界面有待美化,嘿嘿,下面说一下实现过程,当然,我的代码可能不对,就比如后台给前端返回JSON对象,应该包括状态和消息和数据,我这里直接给返回了JSON对象,所以,如果有大神,您知道怎 ...
- Scrapy中的UA池,代理池,以及selenium的应用
UA池 代理池 selenium在Scrapy中的应用 UA池 - 下载中间件: - 下载中间件(Downloader Middlewares) 位于scrapy引擎和下载器之间的一层组件. - 作用 ...
- BZOJ 2288 贪心 +链表
思路: 放个题解好吧. http://www.cnblogs.com/zyfzyf/p/4114774.html //By SiriusRen #include <queue> #incl ...
- BZOJ 2794 DP
思路: 考虑把询问离线 按照m排序 物品按照a排序 f[i]表示c[j]的和到i b的最大值 背包就好 O(nk)竟然能过-- //By SiriusRen #include <cstdio&g ...
- BZOJ 3991 set维护dfs序
思路: set按照dfn排序 两点之间的距离可以O(logn)算出来 加一个点-> now ans+=dis(pre,now)+dis(now,next)-dis(pre-next); 删一个点 ...
- zgb老师关于java集合的总结
数组:存多个数据 操作不便集合(Collection ):存多个数据 管理多个数据 提供更为方便的操作Iterator:专门针对集合 进行迭代List:有序的 允许重复的元素ArrayList:底层数 ...
- JS 经验总结
1.IE中div的高度是content+padding+border之和,其它的是content的高度 2.一个标签里面只有一个属性,class='cls1 cls2' 3.同一页面不能出现相同的id ...
- 决策实验(2)分水岭&哄骗实验
转载请注明http://www.cnblogs.com/igoslly/p/6824544.html 史密斯实验II PART I 分水岭实验 两种选项 A 50%没钱,50% 45元 B 获取固定数 ...
- 读书笔记「Python编程:从入门到实践」_3.列表简介
3.1 列表是什么 列表 由一系列按特定顺序排列的元素组成. 在Python中,用方括号([] )来表示列表,并用逗号来分隔其中的元素. 3.1.1 访问列表元素 指出列表的名称,再指出元素的索引 ...
- 执行opatch apply 报错 OPatch failed with error code 73
.执行opatch apply 报错 OPatch failed [oracle@ora_11g 14275605]$ /opt/oracle/product/db_1/OPatch/opatch a ...