제출 #95260

#제출 시각아이디문제언어결과실행 시간메모리
95260andy627Simurgh (IOI17_simurgh)C++17
51 / 100
180 ms5340 KiB
#include "simurgh.h" #include <bits/stdc++.h> using namespace std; int G[505][505]; int T[505][505]; int N; bool vst[505]; int E[505][505]; vector<int> Q; int P[505]; vector<int> ans; int S[505][505]; int I; bool C[505]; void maketree(int now) { vst[now] = true; for(int i = 0; i < N; i++) { if(vst[i]) continue; if(G[now][i] == -2) continue; T[now][i] = T[i][now] = 1; Q.push_back(E[now][i]); P[i] = now; maketree(i); } } void sib() { for(int i = 0; i < N; i++) { int now = i; while(now != -1) { S[now][i] = 1; now = P[now]; } } } /* void connect(int now, int par) { C[now] = 1; for(int i = 0; i < N; i++) { if(!T[now][i] || i == par) continue; if(G[now][i] == 1) connect(i, now); } }*/ void dfs(int now, int par) { for(int i = 0; i < N; i++) { if(i == par) continue; if(T[now][i]) dfs(i, now); } if(!now) return; int idx; for(int i = 0; i < Q.size(); i++) if(Q[i] == E[now][par]) idx = i; for(int i = 0; i < N; i++) { if(S[now][i] || i == par) continue; if(G[now][i] != -1) continue; Q[idx] = E[now][i]; int tmp = count_common_roads(Q); if(tmp < I) { G[now][par] = G[par][now] = 1; G[now][i] = G[i][now] = 0; } if(tmp > I) { G[now][par] = G[par][now] = 0; G[now][i] = G[i][now] = 1; } } Q[idx] = E[now][par]; for(int i = 0; i < N; i++) { if(S[now][i] || i == par) continue; if(G[now][i] == -1) G[now][i] = G[i][now] = G[now][par]; } if(G[now][par] == -1) { //for(int i = 0; i < N; i++) C[i] = 0; //connect(now, par); int x = -1, y = -1; for(int i = 0; i < N; i++) { if(!S[now][i] || i == now) continue; for(int j = 0; j < N; j++) { if(S[now][j] || G[i][j] != 1) continue; x = i, y = j; } } //printf("%d %d\n", x,y); if(x == -1) G[now][par] = G[par][now] = 1; else { Q[idx] = E[x][y]; int tmp = count_common_roads(Q); if(tmp < I) G[now][par] = G[par][now] = 1; else if(tmp > I) G[now][par] = G[par][now] = 0; else G[now][par] = G[par][now] = G[x][y]; Q[idx] = E[now][par]; } for(int i = 0; i < N; i++) { if(S[now][i] || i == par) continue; if(G[now][i] == -1) G[now][i] = G[i][now] = G[now][par]; } } } std::vector<int> find_roads(int n, std::vector<int> u, std::vector<int> v) { N = n; for(int i = 0; i < N; i++) { for(int j = 0; j < N; j++) { G[i][j] = -2; } } for(int i = 0; i < u.size(); i++) { G[u[i]][v[i]] = G[v[i]][u[i]] = -1; E[u[i]][v[i]] = E[v[i]][u[i]] = i; } P[0] = -1; maketree(0); sib(); I = count_common_roads(Q); dfs(0, -1); /* for(int i = 0; i < N; i++){ for(int j = 0; j < N;j++) { printf("%d ", G[i][j]); } puts(""); }*/ for(int i = 0; i < N; i++) { for(int j = i + 1; j < N; j++) { if(G[i][j] == 1) ans.push_back(E[i][j]); } } return ans; }

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

simurgh.cpp: In function 'void dfs(int, int)':
simurgh.cpp:55:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i < Q.size(); i++) if(Q[i] == E[now][par]) idx = i;
                    ~~^~~~~~~~~~
simurgh.cpp: In function 'std::vector<int> find_roads(int, std::vector<int>, std::vector<int>)':
simurgh.cpp:117:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i < u.size(); i++) {
                    ~~^~~~~~~~~~
simurgh.cpp: In function 'void dfs(int, int)':
simurgh.cpp:54:9: warning: 'idx' may be used uninitialized in this function [-Wmaybe-uninitialized]
     int idx;
         ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...