并查集用法一例

题目:有一个相似属性列表,每一行有一些属性,属性间"\t"分割。若某两行有一个属性相同,则认为他们都相似,要求将其合并。比如相似属性表:

生日 出生日期 出生日

身高 身长

出生年月日 出生时间 出生日期

我们要做的是合并为 “生日 出生日期 出生日期 出生年月日 出生时间”


code如下:

#!/usr/bin/env python
#!-*- coding:utf-8 -*-
#!vim: set ts=8 sw=8 sts=8 tw=100 noet:
# ***************************************************************************
# 
# 
# $Id$ 
# 
# **************************************************************************/
 
import os
import sys
 


node_father={}
output_dict={}
def find_father(item):
	while node_father.has_key(item):
		item=node_father[item]
	return item
for line in sys.stdin:
	lin=line.strip().split('\t')
	if len(lin)!=2:
		continue
	item1=lin[0]
	item2=lin[1]
	f_item1=find_father(item1)
	f_item2=find_father(item2)
	if f_item1==f_item2:
		continue
	else:
		node_father[f_item1]=f_item2
		if not output_dict.has_key(f_item2):
			output_dict[f_item2]=[]
		if f_item1 not in output_dict[f_item2]:
			output_dict[f_item2].append(f_item1)
		if output_dict.has_key(f_item1):
			for item in output_dict[f_item1]:
				if item not in output_dict[f_item2]:
					output_dict[f_item2].append(item)
			output_dict[f_item1]=[]
for item in output_dict:
	output=item
	if output_dict[item]:
		for key in output_dict[item]:
			output+="\t"+key
		print output


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值