书山有径勤为路>>>>>>>>

<<<<<<<<学海无涯苦作舟!

一道简单的并查集题目

Description

现在很多的程序设计语言中,赋值已经是一个不容忽视的问题,如果一个变量在未进行赋值的情况下使用,那么这个值将是不定的(哈哈,我已经被遭了好多次了)!而我写的程序用到的变量实在是太多了,又不想自己统计哪些变量是已经赋值了的,现在就请你帮我统计一下哪些变量已经赋值了。为了简化问题,我们假设最开始仅有变量a中有确定的值。变量为单个小写字母,每行恰好有三个字符,中间一个是赋值运算符'='。请编程求出含N行的程序段运行以后有哪些变量中有确定的值。并且该赋值表达式的出现顺序也即是其在程序中的相对顺序。

Input

T(1<= T <= 27) 表示测试实例个数 N (0 < N ≤ 100) 表示赋值表达式的个数 以下N行中,每行3个字符,为一条语句

Output

在一行中按字母表顺序给出所有有确定值的变量名,中间以一个空格隔开。 如果没有变量被赋值,则输出“none”。

Sample Input

3
1
a=a
2
b=c
c=d
4
b=a
c=d
d=b
e=f

Sample Output

a
none
a b d

//这个题目没有什么好说的,直接并查集OK,
//之所以写这个题目是为了练一下并查集。

View Code
#include "iostream"
using namespace std;
#define size 101
int father[size];
char ans[27];
int find(int k)
{
    return father[k]==k?k:father[k]=find(father[k]);
}
int main()
{
    int T, N, flag;
    char left, mid, right;
    cin>>T;
    while(T--)
    {
        cin>>N;
        for(int i=0; i<27; i++) 
            father[i]=i;
        flag = 0;
        for(int i=0; i<N; i++)
        {
            cin>>left>>mid>>right;
            if(left=='a' && right=='a') flag = 1;
            father[left-'a']=find(right-'a');
        }
        int j=0;
        for(int i=0; i<27; i++)
            if(father[i]==0) ans[j++]=i+'a';
        if(j==1 && flag) cout<<"a"<<endl;
        else if(j>1) 
        {
            for(int i=0; i<j-1; i++)
                cout<<ans[i]<<" ";
            cout<<ans[j-1]<<endl;
        }
        else cout<<"none"<<endl;
    }
}

 

 

posted on 2011-10-22 22:25  More study needed.  阅读(471)  评论(0编辑  收藏  举报

导航

书山有径勤为路>>>>>>>>

<<<<<<<<学海无涯苦作舟!