Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // O(n)
- void bfs(int u, vector<vector<int>>& g, vector<int>& vis){
- queue<int> q;
- q.push(u);
- while(!q.empty()){
- int v = q.front();
- vis[v] = 1;
- q.pop();
- for(int ch: g[v]){
- q.push(ch);
- }
- }
- }
- // determine whether there are players whose rank is certain
- bool toposort(int n, vector<vector<int>>& g, vector<vector<int>>& g_inv){
- vector<int> indegree(n+1,0);
- for(auto& it: g){
- for(int children: it){
- indegree[children]++;
- }
- }
- // [1,2,3,4,5]
- // [0,3,1,0,1]
- queue<int> q;
- vector<int> tp;
- // o(n)
- for(int i=1;i<=n;i++){
- if(indegree[i]==0){
- q.push(i);
- }
- }
- // O(n)
- while(!q.empty())}{
- int player = q.front();
- q.pop();
- tp.push_back(player);
- for(auto& ch: g[player]){
- indegree[ch]--;
- if(indegree[ch]==0)
- q.push(ch);
- }
- }
- int last = tp[n-1];
- vector<int> vis(n+1,0);
- bfs(last,g_inv,vis);
- // o(n)
- for(int i=1;i<=n;i++){
- if(vis[i]==0){
- return false;
- }
- }
- return true;
- }
- }
- bool game(int n, vector<vector<int>>& results) {
- vector<vector<int>> g(n+1);
- for(auto& it: results){
- int winner = it[0];
- int loser = it[1];
- g[winner].push_back(loser);
- ginv[loser].push_back(winner);
- }
- return toposort(n,g, g_inv);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement