欢迎光临散文网 会员登陆 & 注册

校运会C++

2023-07-12 00:14 作者:喵雕沙  | 我要投稿

题目描述

假设一共有 N2N2×104)个参赛选手。

老师会告诉你这 N 个选手的名字。

接着会告诉你 M1M106)句话,即告诉你学生 A 与学生 B 在同一个组里。

如果学生 A 与学生 B 在同一组里,学生 B 与学生 C 也在同一组里,就说明学生 A 与学生 C 在同一组。

然后老师会问你 1K106)句话,即学生 X 和学生 Y 是否在同一组里。

若是则输出 Yes.,否则输出 No.

输入

第一行输入 N 和 M

接下来 N 行输入每一个同学的名字。

再往下 M 行每行输入两个名字,且保证这两个名字都在上面的 N 行中出现过,表示这两个参赛选手在同一个组里。

再来输入 K

接下来输入 K 个体育老师的询问。

输出

对于每一个体育老师的询问,输出 Yes. 或 No.

样例输入 复制

10 6 Jack Mike ASDA Michel brabrabra HeHe HeHE papapa HeY Obama Jack Obama HeHe HeHE brabrabra HeHe Obama ASDA papapa Obama Obama HeHE 3 Mike Obama HeHE Jack papapa brabrabra

样例输出 复制

No. Yes. Yes.

程序

#include<bits/stdc++.h>
using namespace std;
int n,m,k;
string f[20001],mz[20001];
int fname(string name){
    for (int i=1;i<=n;i++){
        if (name==mz[i]) return i;
    }
}
string find(string name){
    if (f[fname(name)]==name) return name;
    return f[fname(name)]=find(f[fname(name)]);
}
int main(){
    scanf("%d %d",&n,&m);
    for (int i=1;i<=n;i++){
        cin>>f[i];
        mz[i]=f[i];
    }
    for (int i=1;i<=m;i++){
        string a,b;
        cin>>a>>b;
        f[fname(find(a))]=find(b);
    }
    scanf("%d",&k);
    for (int i=1;i<=k;i++){
        string a,b;
        cin>>a>>b;
        if (find(a)==find(b)) printf("Yes.\n");
        else printf("No.\n");
    }
    return 0;
}


校运会C++的评论 (共 条)

分享到微博请遵守国家法律