有一个巨巨叫Isenbaev,现在给出n个队伍,如果是某人是他的队友,则这个人对应的数值为1,如果是他队友的队友则为2,以此类推。
首先在这n个队伍中,最多会有3*n个人,用map存在这些人的信息,编号并提取出总人数。
按照队伍里的人相互连边建图,bfs即可。
注意Isenbaev不在的情况,这是所有人都是undefined.
#include <cstdio>
#include <string>
#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
const int INF = 350;
const int maxn = 300 + 5;
map<string, int> m;
vector<int> G[maxn];
string team[maxn][3];
int d[maxn];
int n;
void add_edge(int u, int v) {
G[u].push_back(v);
G[v].push_back(u);
}
void bfs() {
queue<int> q;
fill(d, d + m.size(), INF);
q.push(m["Isenbaev"]);
d[m["Isenbaev"]] = 0;
while (!q.empty()) {
int u = q.front();
q.pop();
for (int i = 0; i < G[u].size(); i++) {
int v = G[u][i];
if (d[v] == INF) {
d[v] = d[u] + 1;
q.push(v);
}
}
}
}
int main(int argc, char const *argv[]) {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
for (int j = 0; j < 3; j++) {
cin >> team[i][j];
m[team[i][j]]++;
}
}
map<string, int>::iterator it;
if (m.find("Isenbaev") == m.end()) {
for (it = m.begin(); it != m.end(); it++) {
cout << it->first << " undefined" << endl;
}
return 0;
}
int num = 0;
for (it = m.begin(); it != m.end(); it++) {
it->second = num;
num++;
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < 3; j++) {
for (int k = j + 1; k < 3; k++) {
add_edge(m[team[i][j]], m[team[i][k]]);
}
}
}
bfs();
for (it = m.begin(); it != m.end(); it++) {
if (d[it->second] == INF) {
cout << it->first << " undefined" << endl;
} else {
cout << it->first << ' ' << d[it->second] << endl;
}
}
return 0;
}