Advertisement
mickypinata

SMMR-T153: Food Web

Mar 27th, 2020
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.25 KB | None | 0 0
  1. #include <algorithm>
  2. #include <iostream>
  3. #include <vector>
  4. #include <queue>
  5. using namespace std;
  6.  
  7. typedef struct chain{
  8.     int s;
  9.     int dis;
  10.     bool operator < (const chain &rhs)const{
  11.         return dis > rhs.dis;
  12.     }
  13. }chain;
  14.  
  15. enum color{
  16.     white, grey, black
  17. };
  18.  
  19. vector<vector<int>> adj;
  20. vector<bool> start;
  21. int nv, ne;
  22. bool cycle;
  23.  
  24. void PrintAdj(){
  25.     for(int i = 1; i <= nv; ++i){
  26.         cout << i << " | ";
  27.         for(auto v : adj[i]){
  28.             cout << v << " ";
  29.         }
  30.         cout << "\n";
  31.     }
  32.     return;
  33. }
  34.  
  35. vector<color> colors;
  36. bool DFSCycle(int u){
  37.     if(colors[u] == grey){
  38.         return true;
  39.     }
  40.     if(colors[u] == black){
  41.         return false;
  42.     }
  43.     colors[u] = grey;
  44.     for(auto v : adj[u]){
  45.         if(DFSCycle(v)){
  46.             return true;
  47.         }
  48.     }
  49.     colors[u] = black;
  50.     return false;
  51. }
  52.  
  53. vector<chain> dist;
  54. void FindPredator(int start){
  55.     queue<int> q;
  56.     dist[start] = {start, 0};
  57.     q.push(start);
  58.     while(!q.empty()){
  59.         int u = q.front();
  60.         q.pop();
  61.         for(auto v : adj[u]){
  62.             if(dist[u].dis + 1 > dist[v].dis){
  63.                 dist[v] = {v, dist[u].dis + 1};
  64.                 q.push(v);
  65.             }
  66.         }
  67.     }
  68.     return;
  69. }
  70.  
  71. int main(){
  72.  
  73.     int u, v;
  74.  
  75.     scanf("%d %d", &nv, &ne);
  76.     adj.assign(nv + 1, vector<int>());
  77.     start.assign(nv + 1, true);
  78.     for(int i = 0; i < ne; ++i){
  79.         scanf("%d %d", &u, &v);
  80.         adj[u].push_back(v);
  81.         start[v] = false;
  82.     }
  83.  
  84.     /// Check Cycle
  85.     colors.assign(nv + 1, white);
  86.     cycle = false;
  87.     for(int i = 1; i <= nv; ++i){
  88.         if(colors[i] == white){
  89.             if(DFSCycle(i)){
  90.                 cycle = true;
  91.                 break;
  92.             }
  93.         }
  94.     }
  95.  
  96.     /// Print
  97.     if(cycle){
  98.         cout << "No";
  99.     } else {
  100.         dist.assign(nv + 1, {0, 0});
  101.         for(int i = 1; i <= nv; ++i){
  102.             if(start[i]){
  103.                 FindPredator(i);
  104.             }
  105.         }
  106.         cout << "Yes\n";
  107.         sort(dist.begin(), dist.end());
  108.         for(int i = 0; i <= nv; ++i){
  109.             if(dist[i].s != 0){
  110.                 cout << dist[i].s << " ";
  111.             }
  112.         }
  113.     }
  114.  
  115.  
  116.     return 0;
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement