SRM 516 NetworkXMessageRecovery

【分析】
這一道其實沒什麼好講的,還是比較裸的拓撲排序。

【代碼】

#define M 255

class NetworkXMessageRecovery {
public:
    int mp[M][M];
    int in[M],mk[M],have[M];
    string ans;
    bool chk(int x){
        return !in[x]&&!mk[x]&&have[x];
    }
    void dfs(int s){
        mk[s]=1;
        ans+=(char)s;

        for(int i='A';i<='Z';i++){
            if(mp[s][i])in[i]--;
        }
        for(int i='a';i<='z';i++){
            if(mp[s][i])in[i]--;
        }

        for(int i='A';i<='Z';i++){
            if(chk(i))dfs(i);
        }
        for(int i='a';i<='z';i++){
            if(chk(i))dfs(i);
        }

    }
    string recover(vector<string>st){
        int n=st.size();
        ans="";
        memset(mp,0,sizeof(mp));
        memset(in,0,sizeof(in));
        memset(mk,0,sizeof(mk));
        memset(have,0,sizeof(have));
        for(int i=0;i<n;i++){
            have[(int)st[i][0]]=1;
            for(int j=1;j<=st[i].length();j++){
                if(!mp[(int)st[i][j-1]][(int)st[i][j]]){
                    mp[(int)st[i][j-1]][(int)st[i][j]]=1;
                    in[(int)st[i][j]]++;
                    have[(int)st[i][j]]=1;
                }
            }
        }
        for(int i='A';i<='Z';i++){
            if(chk(i))dfs(i);//沒有前驅,沒有被標記,並且出現過。 
        }
        for(int i='a';i<='z';i++){
            if(chk(i))dfs(i);
        }
        return ans;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章