【洛谷】P2256

(^_^)

题目:

题目

思路:

这是一道并查集水题,适合初学者做!!!

若不会并查集的点,那是dalao的博客!

本题难点:名字是字符串,要字符串处理

给每个名字一个编号,如\(1,2,3,4,5,6,...\),用\(\texttt{STL的map}\)存下来,然后普通并查集

这题是C++福利啦~

Pascal不知道数组下标能不能用字符串,可以的话一个数组搞定

代码:

拒绝ctrl+C

c++代码

#include <iostream>

using namespace std;

map <string,int> ma;
int f[20010],tot,n,m;

int find(int k){     //并查集find()
    if(f[k]==k)return k;
    return f[k]=find(f[k]);
} 

int main()
{
    //*****初始化***** 
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)f[i]=i;
    //*****存名字***** 
    for(int i=1;i<=n;i++)
    {
        string s;
        cin>>s;
        tot++;
        ma[s]=tot;
    }
    //*****并***** 
    for(int i=1;i<=m;i++)
    {
        string s,st;
        cin>>s>>st;
        int a=ma[s],b=ma[st];
        f[find(a)]=find(b);
    } 
    //*****查*****
    scanf("%d",&m);
    for(int i=1;i<=m;i++)
    {
        string s,st;
        cin>>s>>st;
        int a=ma[s],b=ma[st];
        if(find(a)==find(b))cout<<"Yes.\n";
        else cout<<"No.\n";
    } 
    return 0;
}

转载于:https://www.cnblogs.com/GJY-JURUO/p/2019_07_23_01_11.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值