Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<stdio.h>
- #include<vector>
- #include<queue>
- using namespace std;
- int visited[100010];
- int ct = 0;
- int t;
- vector<int> adj[100010];
- int levelcount[10010];
- int level[100010];
- bool dfs(int u)
- {
- if(ct > t)return false;
- if(visited[u] == 1)return false;
- if(visited[u] == 2)return true;
- visited[u] = 1;
- ct++;
- levelcount[level[u]]++;
- // printf("Test u : %d -> ",u);
- bool b = true;
- for(int i = 0 ; i < adj[u].size() && b; i ++){
- int v = adj[u][i];
- // printf(" %d",v);
- b = dfs(v);
- }
- // printf("\n");
- visited[u] = 2;
- return b;
- }
- int main()
- {
- int n,k;
- scanf("%d %d %d",&n,&k,&t);
- vector<int> levellist[k+1];
- for(int i = 1 ; i <= n ; i ++){
- int l,p;
- scanf("%d %d",&l,&p);
- level[i] = l;
- levellist[l].push_back(i);
- for(int j = 0 ; j < p ; j ++){
- int v;
- scanf("%d",&v);
- adj[i].push_back(v);
- }
- }
- int ans = -1;
- int l = 1 , r = k;
- while(l <= r){
- int m = (l+r)/2;
- // printf("Test m %d\n",m);
- ct = 0;
- for(int i = 0 ; i <= k ; i ++){
- levelcount[i] = 0;
- }
- for(int i = 0 ; i <= n ; i ++){
- visited[i] = 0;
- }
- bool check = true;
- for(int i = 1 ; i <= m && check; i ++){
- for(int j = 0 ; j < levellist[i].size() && check ; j ++){
- int u = levellist[i][j];
- if(visited[u] == 0){
- check = dfs(u);
- }
- }
- }
- if(check){
- // printf("level uping\n");
- for(int j = 1 ; j <= m && check ; j ++){
- // printf("%d < %d ? \n",levelcount[j],levellist[j].size());
- if(levelcount[j] < levellist[j].size()){
- check = false;
- }
- }
- }
- if(check){
- ans = m;
- l = m + 1;
- }
- else{
- r = m - 1;
- }
- }
- printf("%d",ans);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement