题意:
乱序给出一条有n个结点的路径上的每对前前驱结点和后继结点,求原路径。
分析:
水题,直接保存每个结点的后继结点,然后找到开始结点遍历一遍输出就可以了,值得说说的是怎么用map来进行字符串离散化,即把一个字符串和一个整数对应,并给出整数能找到相应的字符串,请参考程序。
代码:
//poj 2491
//sep9
#include <iostream>
#include <string>
#include <map>
using namespace std;
const int maxN=512;
map<string,int> m;
string ans[maxN];
int n;
int start[maxN],next[maxN];
int main()
{
int cases,caseNum=0;
cin>>cases;
while(cases--){
m.clear();
n=0;
memset(start,0,sizeof(start));
memset(next,-1,sizeof(next));
int i,stepNum;
cin>>stepNum;
for(i=1;i<stepNum;++i){
string a,b;
cin>>a>>b;
if(m[a]==0) m[a]=++n;
if(m[b]==0) m[b]=++n;
int u=m[a],v=m[b];
start[v]=1;
next[u]=v;
}
map<string,int>::iterator iter;
for(iter=m.begin();iter!=m.end();++iter)
ans[iter->second]=iter->first;
for(i=1;i<=n;++i)
if(start[i]==0)
break;
printf("Scenario #%d:\n",++caseNum);
while(i!=-1){
cout<<ans[i]<<endl;
i=next[i];
}
cout<<endl;
}
return 0;
}