Advertisement
SuitNdtie

Technology

May 9th, 2019
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.69 KB | None | 0 0
  1. #include<stdio.h>
  2. #include<vector>
  3. #include<queue>
  4. using namespace std;
  5.  
  6. int visited[100010];
  7. int ct = 0;
  8. int t;
  9. vector<int> adj[100010];
  10. int levelcount[10010];
  11. int level[100010];
  12.  
  13. bool dfs(int u)
  14. {
  15.     if(ct > t)return false;
  16.     if(visited[u] == 1)return false;
  17.     if(visited[u] == 2)return true;
  18.    
  19.     visited[u] = 1;
  20.     ct++;
  21.     levelcount[level[u]]++;
  22. //  printf("Test u : %d -> ",u);
  23.     bool b = true;
  24.     for(int i = 0 ; i < adj[u].size() && b; i ++){
  25.         int v = adj[u][i];
  26.     //  printf(" %d",v);
  27.         b = dfs(v);
  28.     }
  29. //  printf("\n");
  30.     visited[u] = 2;
  31.     return b;
  32. }
  33.  
  34.  
  35. int main()
  36. {
  37.     int n,k;
  38.     scanf("%d %d %d",&n,&k,&t);
  39.    
  40.     vector<int> levellist[k+1];
  41.     for(int i = 1 ; i <= n ; i ++){
  42.         int l,p;
  43.         scanf("%d %d",&l,&p);
  44.         level[i] = l;
  45.         levellist[l].push_back(i);
  46.         for(int j = 0 ; j < p ; j ++){
  47.             int v;
  48.             scanf("%d",&v);
  49.             adj[i].push_back(v);
  50.         }
  51.     }
  52.    
  53.     int ans = -1;
  54.     int l = 1 , r = k;
  55.     while(l <= r){
  56.         int m = (l+r)/2;
  57.     //  printf("Test m %d\n",m);
  58.         ct = 0;
  59.    
  60.         for(int i = 0 ; i <= k ; i ++){
  61.             levelcount[i] = 0;
  62.         }
  63.         for(int i = 0 ; i <= n ; i ++){
  64.             visited[i] = 0;
  65.         }
  66.        
  67.         bool check = true;
  68.         for(int i = 1 ; i <= m && check; i ++){
  69.             for(int j = 0 ; j < levellist[i].size() && check ; j ++){
  70.                 int u = levellist[i][j];
  71.                 if(visited[u] == 0){
  72.                     check = dfs(u);
  73.                 }
  74.                    
  75.             }
  76.        
  77.         }
  78.         if(check){
  79.         //  printf("level uping\n");
  80.             for(int j = 1 ; j <= m && check ; j ++){
  81.         //      printf("%d < %d ? \n",levelcount[j],levellist[j].size());
  82.                 if(levelcount[j] < levellist[j].size()){
  83.                     check = false;
  84.                 }
  85.             }
  86.         }
  87.        
  88.        
  89.         if(check){
  90.             ans = m;
  91.             l = m + 1;
  92.         }
  93.         else{
  94.             r = m - 1;
  95.         }
  96.     }
  97.     printf("%d",ans);
  98.     return 0;
  99. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement