Description
Isenbaev's Number: Isenbaev本人为0,Isenbaev的队友为1,Isenbaev的队友的队友为2,……以此类推
Input
第一行:n ([1, 100]) 后n行:n支队伍的队友(三人)
Output
选手名称 Isenbaev's Number/n
Sample Input
input | output |
---|---|
7 Isenbaev Oparin Toropov Ayzenshteyn Oparin Samsonov Ayzenshteyn Chevdar Samsonov Fominykh Isenbaev Oparin Dublennykh Fominykh Ivankov Burmistrov Dublennykh Kurpilyanskiy Cormen Leiserson Rivest | Ayzenshteyn 2 Burmistrov 3 Chevdar 3 Cormen undefined Dublennykh 2 Fominykh 1 Isenbaev 0 Ivankov 2 Kurpilyanskiy 3 Leiserson undefined Oparin 1 Rivest undefined Samsonov 2 Toropov 1 |
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<queue>
using namespace std;
const int INF = 999;
int getIndex(vector<vector<string> > nameList, string name)
{
for(int i = 0; i < nameList.size(); ++ i)
{
if(name == nameList[i][0])
{
return i;
}
}
return -1;
}
bool ifExist(vector<string> nameList, string name)
{
for(int i = 0; i < nameList.size(); ++ i)
{
if(name == nameList[i])
{
return true;
}
}
return false;
}
bool cmp(vector<string> name1, vector<string> name2)
{
return name1[0] < name2[0];
}
int main()
{
vector<vector<string> > nameList;
int n;
cin >> n;
string tem;
getline(cin, tem);<span style="white-space:pre"> </span>、、
for(int i = 0; i < n; ++ i)
{
string _names;
string teammates[3];
getline(cin, _names);
for(int j = 0; j < 3; ++ j)
{
int firstSpaceIndex = _names.find_first_of(' ');
teammates[j] = _names.substr(0, firstSpaceIndex);
_names = _names.substr(firstSpaceIndex+1);
}
for(int j = 0; j < 3; ++ j)
{
int index = getIndex(nameList, teammates[j]);
if(index == -1)
{
vector<string> tempPlayer;
nameList.push_back(tempPlayer);
nameList[nameList.size()-1].push_back(teammates[j]);
index = nameList.size()-1;
}
for(int k = 0; k < 3; ++ k)
{
if(teammates[k] != nameList[index][0] && !ifExist(nameList[index], teammates[k]))
nameList[index].push_back(teammates[k]);
}
}
}
sort(nameList.begin(), nameList.end(), cmp);
vector<int> IseNum(nameList.size());
for(int i = 0; i < nameList.size(); ++ i)
IseNum[i] = INF;<span style="white-space:pre"> </span>//初始化
if(getIndex(nameList, "Isenbaev") != -1) //<span style="font-family: Arial, Helvetica, sans-serif;">Isenbaev可能不存在</span>
{
IseNum[getIndex(nameList, "Isenbaev")] = 0;
queue<int> com;<span style="white-space:pre"> </span>//使用队列进行广度优先遍历
com.push(getIndex(nameList, "Isenbaev"));
while(!com.empty())
{
int q = com.front();
com.pop();
for(int k = 0; k < nameList[q].size(); ++ k)
{
int _index = getIndex(nameList, nameList[q][k]);
if(IseNum[_index] > IseNum[q]+1)
{
IseNum[_index] = IseNum[q]+1;<span style="white-space:pre"> </span>//更新选手的<span style="font-family:Arial, Helvetica, sans-serif;">IseNum</span>
}
}
}
}
for(int i = 0; i < IseNum.size(); ++ i)
{
cout << nameList[i][0] << " ";
if(IseNum[i] < 999) cout << IseNum[i];
else cout << "undefined";
cout << endl;
}
return 0;
}