注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

东月之神

在单纯的观念里面,生命就容易变得比较深刻!

 
 
 

日志

 
 
关于我

别驻足,梦想要不停追逐,别认输,熬过黑暗才有日出,要记住,成功就在下一步,路很苦,汗水是最美的书!

网易考拉推荐

union_find set  

2012-03-08 18:50:19|  分类: 数据结构 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

#include <stdio.h>
#include <string.h>

int rank[100]; /*rank[x]表示x的秩*/
int p[100];  /*p[x]表示x的父节点*/ 

/* 初始化集合*/
void makeset(int x)
{
 rank[x] = 0; //根据实际情况初始化秩也有所变化
 p[x] = x; //根据实际情况指定的父节点可变化
}

/* 查找x元素所在的集合*/
int findset(int x)
{
 int px = x, i;
 while(px != p[px]) px = p[px];
 while(x != px) {
  i = p[x];
  p[x] = px;
  x = i;
 }
return px;
}

/*
   按秩合并x,y所在的集合
   下面的那个if else结构不是绝对的,具体根据情况变化
   但是,宗旨是不变的即,按秩合并,实时更新秩。
*/
void unionset(int x, int y)
{
 x = findset(x);
 y = findset(y);
 if(rank[x] > rank[y]) p[y] = x;
 else {
  p[x] = y;
  if(rank[x] == rank[y]) rank[y]++;
 }
}

int main(int argc, char *argv)
{
 int n;
 while(scanf("%d", &n) != EOF) {
  for(int i = 1; i <= 100; i++)
   makeset(i);
  for(int i = 0; i < n; i++) {
   int a, b;
   scanf("%d%d", &a, &b);
   //a = findset(a); 
   //b = findset(b);
   unionset(a, b);
  }
  for(int i = 1; i <= 2 * n; i++)
   printf("%d ", rank[i]);
  printf("\n");
  for(int i = 1; i <= 2 * n; i++)
   printf("%d ", p[i]);
  printf("\n");
 }
return 0;
}

/*
6
1 2
2 3
1 5
7 8
6 9
4 6

0 1 0 0 0 0 0 1 1 0 0 0
2 2 2 9 2 9 8 8 9 10 11 12
得:
 1、2、3、5是一个集合,
 4、6、9是一个集合,
 7、8是一个集合。
*/

  评论这张
 
阅读(89)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017