题意:
乱序给出一条有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;
}