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

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

一道简单的并查集题目

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   More study needed.  阅读(472)  评论(0编辑  收藏  举报

编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
< 2011年10月 >
25 26 27 28 29 30 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

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

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

点击右上角即可分享
微信分享提示