Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4826357
  • 博文数量: 930
  • 博客积分: 12070
  • 博客等级: 上将
  • 技术积分: 11448
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-15 16:57
文章分类

全部博文(930)

文章存档

2011年(60)

2010年(220)

2009年(371)

2008年(279)

分类: LINUX

2009-08-24 20:55:35

   给定一个字符串的集合,格式如下:{aaa  bbb ccc}, {bbb ddd},{eee fff}, {ddd hhh}要求将其中交集不为空的集合合并,要求合并后的集合之间无交集,例如eg中输出
  {aaa bbb ccc ddd hhh} {eee fff}
  1.不想交集合
    int A[26]...
    aaa<->1  bbb<->2
   
    root1 = find_root(A,1);
    root2 = find_root(A,2);
    union(root1,root2)
 输出的时候找到A[i]<-1的....就是跟再找A[j]=i的所有j就可以了
 
 

#include <stdio.h>
#include <stdlib.h>

#define MAX 26

int relation[5][2] = {
        {1,2},//{"aaa","bbb"}

        {1,3},//{"aaa","ccc"}

        {2,4},
        {5,6},
        {4,8}
      };
      
int find_root(int A[], int x)
{
  if(A[x]<0)
    return x;
  else
    return find_root(A, A[x]);
}

void set_union(int A[], int num1, int num2)
{
  if(A[num1]<A[num2])
    A[num2] = num1;
  else if(A[num1]>A[num2])
    A[num1] = num2;
  else
   {
    A[num1]--;
    A[num2] = num1;
   }
}

int main(int argc, char *argv[])
{
  int i;
  int root1;
  int root2;
  int j = 0;
  int root[2];
  int A[MAX];
  char str1[MAX];
  char str2[MAX];

  for(i=0;i<26;i++)
    A[i] = -1;
    
  for(i=0;i<6;i++)
   {
    root1 = find_root(A, relation[i][0]);
    root2 = find_root(A, relation[i][1]);
    set_union(A,root1, root2);
   }

  for(i=0;i<26;i++)
   {
    if(A[i]<-1)
     {
      printf("%c%c%c\t",i+'a'-1,i+'a'-1,i+'a'-1);
      for(j=0;j<26;j++)
       {
        if(A[j]==i)
          printf("%c%c%c\t",j+'a'-1,j+'a'-1,j+'a'-1);
        }
       printf("\n");
     }
   }
  system("PAUSE");    
  return 0;
}

阅读(1300) | 评论(0) | 转发(0) |
0

上一篇:最大子矩阵问题

下一篇:可配置随机打数

给主人留下些什么吧!~~