제출 #92858

#제출 시각아이디문제언어결과실행 시간메모리
92858emil_physmathHard route (IZhO17_road)C++17
52 / 100
2067 ms59036 KiB
#include <iostream> #include <stdio.h> #include <vector> #include <cstring> using namespace std; const int MAXN=500005; vector<int> nei[MAXN]; pair<int, int> maxdist[MAXN]; bool used[MAXN]; void MaxDist(int u); pair<int, int> DFS(int u, int dep, int dist); int main() { int n; cin>>n; for (int i=1; i<n; i++) { int u, v; scanf("%d%d", &u, &v); nei[u].push_back(v); nei[v].push_back(u); } pair<int, int> ans(0, 0); for (int u=1; u<=n; u++) if (nei[u].size()==1) { memset(used+1, 0, n*sizeof(bool)); MaxDist(u); memset(used+1, 0, n*sizeof(bool)); pair<int, int> curAns=DFS(u, 0, 0); if (curAns.first>ans.first) ans=curAns; else if (curAns.first==ans.first) ans.second+=curAns.second; } cout<<ans.first<<' '<<ans.second/2<<'\n'; char I; cin >> I; return 0; } pair<int, int> DFS(int u, int dep, int dist) { used[u]=true; if (nei[u].size()==1 && used[nei[u][0]]) return make_pair(dep*dist, 1); pair<int, int> ans(0, 0); for (int i=0; i<nei[u].size(); i++) { int to=nei[u][i]; if (!used[to]) { pair<int, int> curAns; if (maxdist[u].first==maxdist[to].first+1) curAns=DFS(to, dep+1, max(dist, maxdist[u].second)); else curAns=DFS(to, dep+1, max(dist, maxdist[u].first)); if (curAns.first>ans.first) ans=curAns; else if (curAns.first==ans.first) ans.second+=curAns.second; } } return ans; } void MaxDist(int u) { used[u]=true; maxdist[u]=make_pair(0, 0); if (nei[u].size()==1 && used[nei[u][0]]) return; for (int i=0; i<nei[u].size(); i++) { int to=nei[u][i]; if (!used[to]) { MaxDist(to); int temp=maxdist[to].first+1; if (temp>maxdist[u].first) { swap(maxdist[u].first, maxdist[u].second); maxdist[u].first=temp; } else if (temp>maxdist[u].second) maxdist[u].second=temp; } } }

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

road.cpp: In function 'std::pair<int, int> DFS(int, int, int)':
road.cpp:49:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i=0; i<nei[u].size(); i++)
                ~^~~~~~~~~~~~~~
road.cpp: In function 'void MaxDist(int)':
road.cpp:72:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int i=0; i<nei[u].size(); i++)
                ~^~~~~~~~~~~~~~
road.cpp: In function 'int main()':
road.cpp:21:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d", &u, &v);
   ~~~~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...