并查集
zafkiel_nightmare
弱弱的程序员
展开
-
hdu 2120 Ice_cream's world I
就是问有多少个圈,简单的并查集,没啥好说的,心塞不开心#includeusing namespace std;int mapp[1000+5];void s(){ for(int i=0;i<1000+5;i++) mapp[i]=i;}int bfs(int x){ if(x!=mapp[x]) { mapp[x]=bfs(mapp[x]); } return m原创 2015-04-11 16:29:22 · 488 阅读 · 0 评论 -
hdu 4496 D-City
并查集水题,给你一张图,问你删掉前I条边之后联通块的个数,倒着合并就可以了#include#define maxn 10010using namespace std;int f[maxn];struct stu{ int a,b;};stu mapp[maxn*10];int re[maxn*10];int n,m;int dfs(int x){ if(f[x原创 2015-10-18 20:35:17 · 241 阅读 · 0 评论 -
hdu 5441 Travel
2015长春网络赛1005比赛的时候没有把询问排序,每一次都重头合并,结果无限TLE#include#includeusing namespace std;int n,m,q,d,sum;struct stu{ int x,y,l;};stu mapp[100010];int f[20010],root[20010];struct stu1{ int x;原创 2015-09-13 20:52:06 · 275 阅读 · 0 评论 -
hdu 1598 find the most comfortable road
并查集+枚举,深搜TLE,感觉广搜有有点戏,没心情试#include#include#define maxn 1010using namespace std;struct stu{ int a,b,l;};stu mapp[maxn];int f[210];int n,m;bool cmp(stu x,stu y){ return x.l<y.l;}int dfs原创 2015-08-26 01:18:33 · 523 阅读 · 0 评论 -
hdu 2545 树上战争
比起并查集,我更想把这题分类为深搜#include#define maxn 100000+10using namespace std;int f[maxn];int dfs(int x){ int sum=0; while(x!=f[x]) { x=f[x]; sum++; } return sum;}int main(){ cin.sync_with_st原创 2015-08-24 19:27:16 · 292 阅读 · 0 评论 -
hdu 1198 Farm Irrigation
这题可以dfs也可以并查集,感觉并查集比较简单就用并查集做了,题目的数据量是有误的,n,m应该远大于50;#include#define maxn 500+5using namespace std;int n,m;int dir[11][4]={{1,0,1,0},{1,0,0,1},{0,1,1,0},{0,1,0,1},{1,1,0,0},{0,0,1,1}, {1,0,1原创 2015-05-22 20:06:17 · 492 阅读 · 0 评论 -
hdu 1116 Play on Words
并查集判断连通,欧拉回路判断是否成链,看网上很多地方都写得很清楚我就不再说什么是欧拉回路了注意首尾的判断一定要用入度与出度的差等于1来判断,而不能用认为入度为0,出度为1的时首,入度为1,出度为0的是尾。给一组数据13abaaabOrdering is possible.#include#define maxn 27+5using namespace std原创 2015-05-07 21:17:37 · 474 阅读 · 0 评论 -
hdu 1829 A Bug's Life
考察并查集,如果2个数的根节点相同,说明他们在同一集合众,检测他们是否是异性,若不是则有Bug如果不相同,也判断一下他们是否异性,若不是,则将其中一个集合的性别翻转,再将其合并,否则直接合并#include#define maxn 2000+5using namespace std;int n,m,flag;int f[maxn];int sign[maxn];void r原创 2015-05-06 12:07:08 · 488 阅读 · 0 评论 -
hdu 2473 Junk-Mail Filter
看了别人的代码算是学到了如何实现并查集的删除,也就是把被删除节点保持不动,继续作为其他点查找的桥梁,然后为该节点重新设置新的节点,在纸上模拟下该过程大概就能懂了#include#include#define maxn 1000000+5using namespace std;string cmd;int n,m,replace;int f[maxn],g[maxn],sign[ma原创 2015-05-06 16:13:59 · 413 阅读 · 0 评论 -
hdu 1325 Is It A Tree?
在hdu 1272 的基础上稍加修改就ac了1272已经判断了无向情况下是否是树形结构,因此我们只需要多判断一下入度为0的点是否只有一个就好了#include#define maxn 100000+5using namespace std;int a,b;int flag;int father[maxn];int sign[maxn];int r[maxn];void re原创 2015-05-06 00:25:01 · 771 阅读 · 0 评论 -
hdu 1272 小希的迷宫
考察并查集,判断是否成环(是否有同样的父节点),判断连通(是否只有一个根节点)#include#define maxn 100000+5using namespace std;int a,b;int flag;int father[maxn];int sign[maxn];void ready(){ for(int i=1;i<maxn;i++) father[i]=i,si原创 2015-05-05 22:53:59 · 522 阅读 · 0 评论 -
hdu 1213 how many tables
简单的并查集,看有多少父节点#include#include#define maxn 1000+5using namespace std;int a[maxn];void pr(){ for(int i=0;i<maxn;i++) a[i]=i;}int dfs(int x){ if(a[x]!=x) a[x]=dfs(a[x]); return a[x];}int原创 2015-03-28 21:46:42 · 318 阅读 · 0 评论 -
hdu 1856 More is better
简单并查集,985ms险过,注意n=0时输出1#include#include#define maxn 10000000+5using namespace std;int a[maxn],b[maxn];int dfs(int x){ if(a[x]!=x) { a[x]=dfs(a[x]); } return a[x];}int main(){ int n;原创 2015-04-08 15:10:38 · 416 阅读 · 0 评论 -
hdu 1232 畅通工程
第二次写并查集的题#includeusing namespace std;int a[1000+5];void fi(){ for(int i=0;i<1000+5;i++) a[i]=i;}int dfs(int x){ if(x!=a[x]) { a[x]=dfs(a[x]); } return a[x];}int main(){ int n,m; w原创 2015-03-21 13:36:39 · 314 阅读 · 0 评论 -
vijos 1034 家族
第一次写并查积,千辛万苦总算是过了#include#define maxn 5000+5using namespace std;int father[maxn];void re(){ int i; for(i=0;i<maxn;i++) { father[i]=i; }}int find(int a)//找根 { if(a!=father[a]) { fat原创 2015-02-16 20:30:29 · 520 阅读 · 0 评论 -
hdu 1811 Rank of Tetris
并查集+拓扑排序#include#include#include#define maxn 20005using namespace std;int n,m;vectorg[maxn];int head[maxn];struct stu{ int a,b; string c;};stu mapp[maxn];int f[maxn];void init(){ fo原创 2016-08-16 19:18:15 · 247 阅读 · 0 评论