题意:没看题, 看数据猜的, 给N个站点, N-1段路的起点和终点, 让你输出整条路线。
题解:
用两个map 一个存某个站点出现的次数, 一个存某段路的起点和中点,找出只出现一次的两个点(起点和终点),判一下起点,从起点开始迭代输出站点即可;
//code
#include<iostream>
#include<map>
#include<cstdio>
#include<cstring>
#include<string>
#include<cctype>
#include<algorithm>
using namespace std;
struct String{
char value[100];
friend bool operator < (String a, String b)
{
return strcmp(a.value, b.value)<0;
}
};
int main()
{
int Case;
scanf("%d", &Case);
int cnt = 0;
while(Case --)
{
map<String, int>_m_num;
map<String, int>::iterator it_num, st;
map<String, String>_m;
map<String, String>::iterator it, en;
int n;
scanf("%d", &n);
n--;
while(n --){
String tmp1, tmp2;
scanf("%s%s", tmp1.value, tmp2.value);
it_num = _m_num.find(tmp1);
if(it_num == _m_num.end()) _m_num.insert(map<String, int>::value_type(tmp1, 1));
else it_num->second++;
it_num = _m_num.find(tmp2);
if(it_num == _m_num.end()) _m_num.insert(map<String, int>::value_type(tmp2, 1));
else it_num->second++;
_m.insert(map<String, String>::value_type(tmp1, tmp2));
}
for(it_num = _m_num.begin(); it_num!=_m_num.end(); ++it_num)
{
if(it_num->second == 1)
{
it = _m.find(it_num->first);
if(it!=_m.end()) break;
}
}
printf("Scenario #%d:\n", ++cnt);
while(it!=_m.end())
{
printf("%s\n", it->first.value);
en = it;
it = _m.find(it->second);
}
printf("%s\n\n", en->second.value);
}
return 0;
}