#include<bits/stdc++.h> using namespace std; const int maxn=4e6+7, INF = 400000; vector<int> G[maxn]; int parent_l[maxn], parent_r[maxn], visited[maxn], moves[maxn], result; pair<int, int> decode[maxn]; map<pair<int, int>, int> code; vector<int> input[2005]; queue<int> q; void bfs(int start, int k){ visited[start] = 1; q.push(start); while(!q.empty()){ int a = q.front(); //cout<<moves[a]<<" "<<input[decode[a].first][decode[a].second]<<" "<<decode[a].first<<" "<<decode[a].second<<endl; q.pop(); pair<int, int> temp = decode[a]; if(moves[a] <=k && input[temp.first][temp.second]==1){ result = 1; return ; } if(moves[a] <= k && result>input[temp.first][temp.second]) result = input[temp.first][temp.second]; for(int i=0; i<G[a].size(); i++){ if(visited[G[a][i]]!=1){ if(min(parent_r[G[a][i]], parent_l[G[a][i]]) == 0) moves[G[a][i]] = max(moves[parent_r[G[a][i]]], moves[parent_l[G[a][i]]]) +1; else{ moves[G[a][i]] = max(moves[parent_l[G[a][i]]], moves[parent_r[G[a][i]]]) + min(moves[parent_l[G[a][i]]], moves[parent_r[G[a][i]]]) + 1; if(moves[parent_l[G[a][i]]]<moves[parent_r[G[a][i]]]) moves[G[a][i]]-=max(moves[parent_r[parent_l[G[a][i]]]], moves[parent_l[parent_l[G[a][i]]]]); else moves[G[a][i]]-=max(moves[parent_r[parent_r[G[a][i]]]], moves[parent_l[parent_r[G[a][i]]]]); } visited[G[a][i]]=1; if(moves[G[a][i]]<=k) q.push(G[a][i]); } } } } int main(){ ios_base::sync_with_stdio(false); int n, k, counter=0; cin>>n>>k; vector<int>temp1, temp2; for(int i=0; i<n; i++) for(int j=0; j<=i; j++){ int a; cin>>a; input[i].push_back(a); decode[counter] = make_pair(i, j); code[make_pair(i,j)] = counter; int v = counter, father_l, father_r; if(i>0){ if(j-1>=0){ father_l = code[make_pair(i-1, j-1)]; G[father_l].push_back(v); parent_l[v] = father_l; if(j<i){ father_r = code[make_pair(i-1, j)]; parent_r[v] = father_r; G[father_r].push_back(v); } } else if(j<i){ father_r = code[make_pair(i-1, j)]; parent_r[v] = father_r; G[father_r].push_back(v); if(j-1>=0){ father_l = code[make_pair(i-1, j-1)]; parent_l[v] = father_l; G[father_l].push_back(v); } } } counter++; } moves[0] = 1; result = INF; bfs(0, k); cout<<result<<endl; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | #include<bits/stdc++.h> using namespace std; const int maxn=4e6+7, INF = 400000; vector<int> G[maxn]; int parent_l[maxn], parent_r[maxn], visited[maxn], moves[maxn], result; pair<int, int> decode[maxn]; map<pair<int, int>, int> code; vector<int> input[2005]; queue<int> q; void bfs(int start, int k){ visited[start] = 1; q.push(start); while(!q.empty()){ int a = q.front(); //cout<<moves[a]<<" "<<input[decode[a].first][decode[a].second]<<" "<<decode[a].first<<" "<<decode[a].second<<endl; q.pop(); pair<int, int> temp = decode[a]; if(moves[a] <=k && input[temp.first][temp.second]==1){ result = 1; return ; } if(moves[a] <= k && result>input[temp.first][temp.second]) result = input[temp.first][temp.second]; for(int i=0; i<G[a].size(); i++){ if(visited[G[a][i]]!=1){ if(min(parent_r[G[a][i]], parent_l[G[a][i]]) == 0) moves[G[a][i]] = max(moves[parent_r[G[a][i]]], moves[parent_l[G[a][i]]]) +1; else{ moves[G[a][i]] = max(moves[parent_l[G[a][i]]], moves[parent_r[G[a][i]]]) + min(moves[parent_l[G[a][i]]], moves[parent_r[G[a][i]]]) + 1; if(moves[parent_l[G[a][i]]]<moves[parent_r[G[a][i]]]) moves[G[a][i]]-=max(moves[parent_r[parent_l[G[a][i]]]], moves[parent_l[parent_l[G[a][i]]]]); else moves[G[a][i]]-=max(moves[parent_r[parent_r[G[a][i]]]], moves[parent_l[parent_r[G[a][i]]]]); } visited[G[a][i]]=1; if(moves[G[a][i]]<=k) q.push(G[a][i]); } } } } int main(){ ios_base::sync_with_stdio(false); int n, k, counter=0; cin>>n>>k; vector<int>temp1, temp2; for(int i=0; i<n; i++) for(int j=0; j<=i; j++){ int a; cin>>a; input[i].push_back(a); decode[counter] = make_pair(i, j); code[make_pair(i,j)] = counter; int v = counter, father_l, father_r; if(i>0){ if(j-1>=0){ father_l = code[make_pair(i-1, j-1)]; G[father_l].push_back(v); parent_l[v] = father_l; if(j<i){ father_r = code[make_pair(i-1, j)]; parent_r[v] = father_r; G[father_r].push_back(v); } } else if(j<i){ father_r = code[make_pair(i-1, j)]; parent_r[v] = father_r; G[father_r].push_back(v); if(j-1>=0){ father_l = code[make_pair(i-1, j-1)]; parent_l[v] = father_l; G[father_l].push_back(v); } } } counter++; } moves[0] = 1; result = INF; bfs(0, k); cout<<result<<endl; } |