题目描述
锦瑟年华谁与度 莫问情归处 只影向斜阳 剑吼西风 欲把春留驻
天涯芳草无归路 回首花无数 解语自销魂 弱袂萦春 尘缘不相误
......
在卡勒沃夫充满文学杀伤力的声音中,身处紫荆2号楼202B的四位远近高低各不同的室友纷纷回忆起了各自波澜起伏的过去,并对长在百草园,邻有百花谷的现状表达了各自的见解。
某Q:" ...我小学就开窍了...她的父母说我很好,但是...今天又和北林的联系了..."
某X:" ...差点就成了,结果到学校了...这个方法放假了我去对我的同桌用!..."
某W:" ..." (千言万语不言中,有大量的故事等待考古)
某Z:" ...为了来清华...咱们审美观不一样,不会抢..."
......
卡勒沃夫在这个不朽的夜话中搜集出了某人零散的历任女友资料,为了强迫某人将他出的题目的标程交出,现在卡勒沃夫需要一个能将这些零散信息整合起来的 程序。伴随着雄壮委婉动人的音乐,身为程序设计快男(超女)的你降临了!卡勒沃夫正对着您做Orz状并请求着:" 神牛啊请施舍给我一段程序把偶米头 发~" 。。
输入
第一行为一个不超过5的整数T,表示数据的组数。之后每组数据的一行为一个不超过100的整数n。之后n行每行有两个用单个空格隔开的字符串(每个字符串只有英文大小写字母,长度不超过10),为两位mm的名字。每行第一个mm先于第二个mm成为某人的女友。
在这里我们假装诅咒某人不会同时被两个或两个以上mm泡,某个mm抛弃了某人后不会再吃回头草,同时卡勒沃夫深邃的洞察力使得他收集到了充足的信息以确定某人女友的先后顺序。
在小数据组中出现的人物不超过13个
输出
输出T行,每行对应一组数据,并按照mm们从先到后成为某人女友的顺序输出她们的名字,各个名字间用一个空格隔开。
样例输入
2
2
RY Unknown
YSZ RY
3
tomorrow yestoday
tomorrow today
today yestoday
样例输出
YSZ RY Unknown
tomorrow today yestoday
提示
C语言在线学习平台微信号dotcpp
来源
算法提高
解题思路:拓扑排序
当一个点的入度为0时候,那么此刻她是当前女友。
注意事项:因为是多组测试数据,因此需要处理好初始化的工作,否则容易出现部分正确的情况。
参考代码:
#include<iostream>
#include<algorithm>
#include<map>
#include<cstring>
#include<string>
#include<vector>
#include<set>
#include<queue>
using namespace std;
int cnt,InNum[110],res[110],vis[110];
vector<int>Next[110];
map<string,int>mp;
map<int,string>names;
int num(string name)
{
if(mp.find(name)==mp.end())
{
mp[name]=++cnt;
names[cnt]=name;
}
return mp[name];
}
/*
void dfs(int pre,int dep,int*res,int &ok)
{
if(ok==true) return ;
for(set<int>::iterator it=next[pre].begin();it!=next[pre].end();it++)//寻找
{
int u = *it;
if(!vis[u])
{
int flag = true;
for(int k=1;k<=dep-1;k++)
{
int p=res[k];
if(prex[p].find(u)!=prex[p].end())
{
flag=false;
break;
}
}
if(flag==false) continue;
vis[u]=true;
res[dep]=u;
if(dep==cnt)
{
ok=true;
for(int i=1;i<=cnt;i++)
{
cout<<names[i];
if(i!=cnt) cout<<" ";
}
}
else
{
dfs(u,dep+1,res,ok);
}
vis[u]=false;
}
}
}
*/
int main(void)
{
//freopen("D:\\input1.txt","r",stdin);
int T,n;
cin>>T;
while(T--)
{
//初始化
cnt=0;
mp.clear();
names.clear();
for(int i=0;i<110;i++) Next[i].clear();
memset(vis,0,sizeof(vis));
memset(InNum,0,sizeof(InNum));
cin>>n;
for(int i=1;i<=n;i++)
{
string name1,name2;
cin>>name1>>name2;
int num1=num(name1);
int num2=num(name2);
Next[num1].push_back(num2);
InNum[num2]++;//入度加一
}
queue<int>Q;
for(int i=1;i<=cnt;i++) if(InNum[i]==0)
{
vis[i]=true;
Q.push(i);
}
int count=0;
while(!Q.empty())
{
count++;
int t = Q.front(); Q.pop();
res[count]=t;
for(int i=0;i<Next[t].size();i++)
{
int p = Next[t][i];
InNum[p]--;
}
for(int i=1;i<=cnt;i++) if(InNum[i]==0 && vis[i]==false)
{
vis[i]=true;
Q.push(i);
}
}
for(int i=1;i<=cnt;i++)
{
cout<<names[res[i]];
if(i!=cnt) cout<<" ";
}
if(T) cout<<endl;
}
return 0;
}