1. 程式人生 > >【uva-200】Rare Order(拓撲排序過的第一道)

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

題目大意:
輸入一堆按新的字母排序從小到大排好的字串,#作為結束。
求新的字母排序規則。

思路:
不知道一共多少組所以兩個兩個比較咯。
注意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;
}