Submission #525259

#TimeUsernameProblemLanguageResultExecution timeMemory
525259qwerasdfzxclMountains and Valleys (CCO20_day1problem3)C++14
2 / 25
16 ms24276 KiB
#include <bits/stdc++.h> typedef long long ll; using namespace std; struct Edge{ int v, w, i; Edge(){} Edge(int _v, int _w, int _i): v(_v), w(_w), i(_i) {} }; vector<Edge> adj[500500]; int on[2002000], W[2002000], dist[500500]; vector<Edge> E; vector<int> P, cyc; bool dfs0(int s, int e, int pa = -1){ cyc.push_back(s); if (s==e) return 1; for (auto &v:adj[s]) if (v.v!=pa && on[v.i]){ P.push_back(v.i); if (dfs0(v.v, e, s)) return 1; P.pop_back(); } return 0; } void dfs(int s, int pa = -1, int w = 0){ if (pa==-1) dist[s] = 0; else dist[s] = dist[pa] + w; for (auto &v:adj[s]) if (v.v!=pa && on[v.i]) dfs(v.v, s, v.w); } int cur = 0, ans = 1e9, m; int calc(int s, int n){ fill(dist, dist+n, 0); dfs(s); if (*max_element(dist, dist+n)==0) return 0; dfs(max_element(dist, dist+n)-dist); return *max_element(dist, dist+n); } int main(){ int n; scanf("%d %d", &n, &m); for (int i=1;i<=m;i++){ int x, y, z; scanf("%d %d %d", &x, &y, &z); adj[x].emplace_back(y, z, i); adj[y].emplace_back(x, z, i); W[i] = z; if (z==1) on[i] = 1, cur++; else E.emplace_back(x, y, i); } ans = min(ans, cur*2 - calc(0, n)); if (n>500) {printf("%d\n", ans); return 0;} for (auto &e:E){ P.clear(); cyc.clear(); assert(dfs0(e.v, e.w)); on[e.i] = 1, cur += W[e.i]; int tval = 1e9; for (auto &x:P){ on[x] = 0, cur -= W[x]; ans = min(ans, cur*2 - calc(0, n)); tval = min(tval, cur*2 - calc(0, n)); on[x] = 1, cur += W[x]; } ///cycle on[e.i] = 0; vector<int> deep; int len = W[e.i] + P.size(); for (auto &x:P) on[x] = 0; for (auto &x:cyc){ fill(dist, dist+n, 0); dfs(x); deep.push_back(*max_element(dist, dist+n)); ans = min(ans, cur*2-len-calc(x, n)); //printf("%d: %d\n", x, calc(x, n)); //for (int i=1;i<=9;i++) printf("%d", on[i]); //printf("\n"); } for (int i=0;i<(int)cyc.size();i++){ int clen = 0; for (int j=i+1;j<(int)cyc.size();j++){ clen++; assert(cur*2 - (max(clen, len-clen) + deep[i] + deep[j]) >= tval); //ans = min(ans, cur*2 - (max(clen, len-clen) + deep[i] + deep[j])); } } /// for (auto &x:P) on[x] = 1; on[e.i] = 0, cur -= W[e.i]; } printf("%d\n", ans); return 0; }

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:45:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   45 |     scanf("%d %d", &n, &m);
      |     ~~~~~^~~~~~~~~~~~~~~~~
Main.cpp:48:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   48 |         scanf("%d %d %d", &x, &y, &z);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...