| Problem | Verdict | Lang | Time | Best | Rank | Submit Time | 
|---|---|---|---|---|---|---|
  | discuss11060 -  | Accepted | C++11 | 0.020 | 0.000 | 3082 | 40 secs ago | 
Suggest:
This problem has two important points to note:
<1> The Topological Sort algorithm using DFS is not feasible in this problem. (maybe)
Despite trying for a day, I couldn't find a solution using this approach. Some hints from uDebug also suggest that DFS cannot be used to find the topological order, and instead, Kahn's algorithm should be used.
<2> The input can have duplicate values, which can lead to incorrect results. 
Example:
4
c
w
ca
v
5
c v
c ca
c ca
v ca
v w
#include <bits/stdc++.h>
#define X first
#define Y second
using namespace std;
int n, m;
unordered_map<string, bool> g;
unordered_map<string, int> indegree;
vector<pair<int, string>> vertex;
priority_queue<pair<int, string>> listSource;
int main(){
    ios::sync_with_stdio(false); cin.tie(nullptr);
    int cnt= 0;
    while (cin >> n) {  vertex.clear(); g.clear(); indegree.clear();
        string s;
        for(int i=0; i<n; i++)
            cin >> s, vertex.push_back({n-i,s});
        cin >> m;
        while(m--){
            string u, v;
            cin >> u >> v;
            if (g[u+"+"+v] == true) continue;
            g[u+"+"+v]= true;
            indegree[v]++;
        }
        for (auto p: vertex)
            if (!indegree[p.Y]) listSource.push({p.X, p.Y});
        cout<<"Case #"<<++cnt<<": Dilbert should drink beverages in this order: ";
        string topo="";
        while (!listSource.empty()) {
            string u = listSource.top().Y;  listSource.pop();
            topo+=u+" ";
            for (auto p : vertex) {
                auto v= p.Y;
                if (g[u+"+"+v]){
                    indegree[v]--;
                    if (!indegree[v]) listSource.push({p.X, p.Y});
                }
            }
        }
        topo.erase(topo.size()-1);
        cout<<topo<<".\n\n";
    }
}

No comments:
Post a Comment