제출 #296591

#제출 시각아이디문제언어결과실행 시간메모리
296591williamMBDK꿈 (IOI13_dreaming)C++14
18 / 100
113 ms17928 KiB
#include<bits/stdc++.h> #include "dreaming.h" using namespace std; int N, M; vector<vector<pair<int,int>>> adj (1e5), distances (1e5); vector<int> mxdist (1e5); vector<vector<int>> getcomps(){ vector<bool> v (N); vector<vector<int>> res; for(int i = 0; i < N; i++){ if(!v[i]){ queue<int> q; q.push(i); res.push_back({}); while(!q.empty()){ int curr = q.front(); q.pop(); if(v[curr]) continue; v[curr] = 1; res[res.size() - 1].push_back(curr); for(auto e : adj[curr]) q.push(e.first); } } } return res; } int dfs1(int node, int p){ for(int i = 0; i < adj[node].size(); i++){ if(adj[node][i].first == p) continue; distances[node][i].first = dfs1(adj[node][i].first, node) + adj[node][i].second; distances[node][i].second = i; } sort(distances[node].rbegin(), distances[node].rend()); if(distances[node].size() < 2) return 0; // right? return distances[node][0].first; } void dfs2(int node, int p, int mxp){ if(p == -1){ if(adj[node].size() > 0) mxdist[node] = distances[node][0].first; else mxdist[node] = 0; }else if(adj[node].size() == 1){ mxdist[node] = mxp; }else{ mxdist[node] = max(mxp, distances[node][0].first); // right? } // cout << mxdist[node] << " " << node << endl; for(int i = 0; i < adj[node].size(); i++){ if(adj[node][i].first == p) continue; int t = mxp; if(distances[node][0].second == i){ if(distances[node].size() >= 3) t = max(t, distances[node][1].first); }else{ t = max(t, distances[node][0].first); //right? } t += adj[node][i].second; dfs2(adj[node][i].first, node, t); } } int travelTime(int _N, int _M, int L, int A[], int B[], int T[]) { N = _N; M = _M; for(int i = 0; i < M; i++){ adj[A[i]].push_back({B[i],T[i]}); adj[B[i]].push_back({A[i],T[i]}); distances[A[i]].push_back({-1,-1}); distances[B[i]].push_back({-1,-1}); } vector<vector<int>> components = getcomps(); int C = components.size(); vector<int> compdists (C, INT_MAX); for(int i = 0; i < C; i++){ // cout << "root" << components[i][0] << endl; dfs1(components[i][0], -1); dfs2(components[i][0], -1, 0); for(int j = 0; j < components[i].size(); j++){ compdists[i] = min(compdists[i], mxdist[components[i][j]]); } } sort(compdists.rbegin(), compdists.rend()); if(C == 1){ return compdists[0]; }else if(C == 2){ return L + compdists[0] + compdists[1]; }else{ return max(L + compdists[0] + compdists[1], 2 * L + compdists[1] + compdists[2]); } }

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

dreaming.cpp: In function 'int dfs1(int, int)':
dreaming.cpp:27:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   27 |  for(int i = 0; i < adj[node].size(); i++){
      |                 ~~^~~~~~~~~~~~~~~~~~
dreaming.cpp: In function 'void dfs2(int, int, int)':
dreaming.cpp:46:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   46 |  for(int i = 0; i < adj[node].size(); i++){
      |                 ~~^~~~~~~~~~~~~~~~~~
dreaming.cpp: In function 'int travelTime(int, int, int, int*, int*, int*)':
dreaming.cpp:74:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   74 |   for(int j = 0; j < components[i].size(); j++){
      |                  ~~^~~~~~~~~~~~~~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...