【uva-200】Rare Order(拓扑排序过的第一道)

来源:互联网 发布:淘宝网怎么修改差评 编辑:程序博客网 时间:2024/06/05 19:42

题目大意:
输入一堆按新的字母排序从小到大排好的字符串,#作为结束。
求新的字母排序规则。

思路:
不知道一共多少组所以两个两个比较咯。
注意dfs第一个得到的是最小的字母。
是反序的要用stack倒着输出。


/*    uva 200 by zhuhua    Time limit: 3000 ms    AC Time: 0 ms???*/#include <iostream>#include <string>#include <cstring>#include <algorithm>#include <vector>#include <stack>#include <map>using namespace std;vector <int> C[30];vector <int> tot;stack <int> output;bool visit[30];bool exist[30];void doit(string s1,string s2){    int len1,len2,len;    int x,y;    len1=s1.length();    len2=s2.length();    len=min(len1,len2);    for(int i=0;i<len;i++)    {        if(s1[i]!=s2[i])        {            x=s1[i]-'A';            y=s2[i]-'A';            C[x].push_back(y);            if(!exist[x])                {tot.push_back(x);exist[x]=true;}            if(!exist[y])                {tot.push_back(y);exist[y]=true;}            break;        }    }}void dfs(int x){    visit[x]=true;    for(int i=0;i<C[x].size();i++)    {        int next=C[x][i];        if(!visit[next])        dfs(next);    }    output.push(x);}int main(){    int i=0;    while(i<26)        {C[i].clear();i++;}    tot.clear();    while(!output.empty())        output.pop();    memset(visit,0,sizeof(visit));    memset(exist,0,sizeof(exist));    string strpre,str;    cin>>strpre;    if(strpre=="#")return 0;    while(cin>>str)    {        if(str=="#")break;        doit(strpre,str);        strpre=str;    }    for(int i=0;i<tot.size();i++)    {        int now=tot[i];        if(!visit[now])        {            dfs(now);        }    }    while(!output.empty())    {        char out=output.top()+'A';        cout<<out;        output.pop();    }cout<<endl;    return 0;}
原创粉丝点击