Timus 1837 Isenbaev's Number

原题:Isenbaev’s Number

题意:读入n,接下来n行每行读入三个字符串代表一个小组,每个人都想知道自己与Isenbaev的关系有多近。即Isenbaev为0,Isenbaev的组员为1,Isenbaev的组员的组员为2,以此类推…没有关系的输出undefined

解:这只是简单的图论题目,以Isenbaev为原点进行bfs即可,建议使用map和set

#include <iostream>
#include <map>
#include <set>
using namespace std;

map<string, set<string> > a;
map<string, int> f;
set<string> name;
set<string> p;
string t[1000];
set<string>::iterator iters;
int n, m = 0;

int main() {

    cin >> n;
    string  s1, s2, s3;
    for (int i = 1; i <= n; i++) {
        cin >> s1 >> s2 >> s3;
        name.insert(s1);
        name.insert(s2);
        name.insert(s3);
        a[s1].insert(s2);
        a[s1].insert(s3);
        a[s2].insert(s1);
        a[s2].insert(s3);
        a[s3].insert(s1);
        a[s3].insert(s2);
        f[s1] = -1;
        f[s2] = -1;
        f[s3] = -1;
    }
    f["Isenbaev"] = 0;
    t[1] = "Isenbaev";
    p.insert("Isenbaev");
    int i = 0, j = 1;
    while (i < j) {
        i++;
        for (iters = a[t[i]].begin(); iters != a[t[i]].end(); iters++) {
            if (p.find(*iters) == p.end()) {
                f[*iters] = f[t[i]]+1;
                p.insert(*iters);
                t[++j] = *iters;
            }
        }
    }
    for (iters = name.begin(); iters != name.end(); iters++) {
        cout << *iters << " ";
        if (f[*iters] == -1)
            cout << "undefined\n";
        else cout << f[*iters] << endl;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值