Submission #525667

#TimeUsernameProblemLanguageResultExecution timeMemory
525667qwerasdfzxclMountains and Valleys (CCO20_day1problem3)C++14
3 / 25
1689 ms13120 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(); cyc.pop_back(); } return 0; } int MX, IDX; void dfs(int s, int pa = -1, int w = 0){ if (pa==-1) dist[s] = 0; else dist[s] = dist[pa] + w; if (dist[s]>MX){ MX = dist[s], IDX = s; } for (auto &v:adj[s]) if (v.v!=pa && on[v.i]) dfs(v.v, s, v.w); } int cur = 0, ans = 1e9; int calc(int s, int n){ MX = 0, IDX = s; dfs(s); if (MX==0) return 0; MX = 0; dfs(IDX); return MX; } int main(){ int n, m; 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)); cur += W[e.i]; int len = W[e.i] + P.size(); for (auto &x:P) on[x] = 0; ///cycle //for (auto &x:cyc) ans = min(ans, cur*2 - len - calc(x, n)); ///tree vector<int> deep, mx(cyc.size(), -1e9); for (auto &x:cyc){ MX = 0, IDX = x; dfs(x); deep.push_back(MX); } for (int i=(int)cyc.size()-1;i>=0;i--){ if (i+1<(int)cyc.size()) mx[i] = mx[i+1]; mx[i] = max(mx[i], deep[i]-i); } for (int i=0;i<(int)cyc.size()-1;i++){ ans = min(ans, (cur-1)*2 - (len + deep[i] + i + mx[i+1])); } /// for (auto &x:P) on[x] = 1; cur -= W[e.i]; } printf("%d\n", ans); return 0; }

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:52:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   52 |     scanf("%d %d", &n, &m);
      |     ~~~~~^~~~~~~~~~~~~~~~~
Main.cpp:55:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   55 |         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...