제출 #16685

#제출 시각아이디문제언어결과실행 시간메모리
16685suhgyuho_william경주 (Race) (IOI11_race)C++98
9 / 100
3072 ms393216 KiB
#include "race.h" #include <vector> #include <queue> #include <algorithm> using namespace std; // 문제 : frozen 과 비슷 int i,n,k; int answer = 999999999; vector<pair<int,int> > edge[200002]; queue<pair<int,int> > q,qt; int root[1000002],small[1000002]; bool check[200002],checkv[200002]; vector<int> down[200002]; queue<int> qv; int downcnt[200002]; int nextv,cost; void make_down(int v){ qv.push(v); checkv[v] = true; while(!qv.empty()){ v = qv.front(); for(i=0; i<edge[v].size(); i++){ nextv = edge[v][i].first; if(!checkv[nextv]){ checkv[nextv] = true; qv.push(nextv); down[v].push_back(nextv); } } qv.pop(); } } int find_sum(int x){ int sum = 1; for(i=0; i<down[x].size(); i++){ sum += find_sum(down[x][i]); } downcnt[x] = (sum-1); return sum; } int find_middle(int x){ while(1){ for(i=0; i<down[x].size(); i++) if(!check[down[x][i]] && downcnt[down[x][i]]+1 > (downcnt[x]+1)/2) break; if(i == down[x].size()) break; downcnt[x] -= (downcnt[down[x][i]]+1); down[down[x][i]].push_back(x); x = down[x][i]; } return x; } void dfs(int v,int sum,int cnt){ if(sum > k) return; check[v] = true; q.push(make_pair(sum,cnt)); qt.push(make_pair(sum,cnt)); for(i=0; i<edge[v].size(); i++){ if(check[edge[v][i].first]) continue; dfs(edge[v][i].first,sum+edge[v][i].second,cnt+1); } check[v] = false; } // T(n) = 2T(n/2) + O(n); int tsum,tcnt; void race(int x){ int v = find_middle(x); check[v] = true; root[0] = v; small[0] = 0; for(i=0; i<edge[v].size(); i++){ if(check[edge[v][i].first]) continue; dfs(edge[v][i].first,edge[v][i].second,1); while(!q.empty()){ tsum = q.front().first; if(root[k-tsum] == v) answer = min(answer,small[k-tsum] + q.front().second); q.pop(); } while(!qt.empty()){ tsum = qt.front().first; tcnt = qt.front().second; if(root[tsum] != v){ root[tsum] = v; small[tsum] = tcnt; }else if(small[tsum] > tcnt) small[tsum] = tcnt; qt.pop(); } } for(i=0; i<edge[v].size(); i++) if(!check[edge[v][i].first]) race(edge[v][i].first); } int best_path(int N, int K, int H[][2], int L[]) { n = N; k = K; for(i=0; i<n-1; i++){ edge[H[i][0]].push_back(make_pair(H[i][1],L[i])); edge[H[i][1]].push_back(make_pair(H[i][0],L[i])); } for(i=0; i<=k; i++) root[i] = -1; make_down(0); find_sum(0); race(0); if(answer == 999999999) answer = -1; return answer; }

컴파일 시 표준 에러 (stderr) 메시지

race.cpp: In function 'void make_down(int)':
race.cpp:24:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(i=0; i<edge[v].size(); i++){
                  ~^~~~~~~~~~~~~~~
race.cpp: In function 'int find_sum(int)':
race.cpp:39:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(i=0; i<down[x].size(); i++){
              ~^~~~~~~~~~~~~~~
race.cpp: In function 'int find_middle(int)':
race.cpp:48:19: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(i=0; i<down[x].size(); i++) if(!check[down[x][i]] && downcnt[down[x][i]]+1 > (downcnt[x]+1)/2) break;
                  ~^~~~~~~~~~~~~~~
race.cpp:49:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         if(i == down[x].size()) break;
            ~~^~~~~~~~~~~~~~~~~
race.cpp: In function 'void dfs(int, int, int)':
race.cpp:64:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(i=0; i<edge[v].size(); i++){
              ~^~~~~~~~~~~~~~~
race.cpp: In function 'void race(int)':
race.cpp:79:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(i=0; i<edge[v].size(); i++){
              ~^~~~~~~~~~~~~~~
race.cpp:97:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(i=0; i<edge[v].size(); i++) if(!check[edge[v][i].first]) race(edge[v][i].first);
              ~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...