C - 災害に強い通信ネットワーク / Disaster-Resistant Communication Network Editorial by admin
Claude 4.6 Opus (Thinking)Overview
Given \(N\) cities on a straight line, we need to construct a communication network at minimum cost such that the network remains connected even if any single city is removed (i.e., the network is 2-vertex-connected). The answer is \(2 \times (\max(X_i) - \min(X_i))\).
Analysis
Rephrasing the Disaster Resilience Condition
The condition “the remaining network stays connected even after removing any single city and its connected lines” is exactly the definition of biconnected (2-vertex-connected) in graph theory.
Deriving the Lower Bound
In a 2-vertex-connected graph, there exist 2 edge-disjoint paths between any two vertices (Whitney’s theorem).
Between the leftmost city \(x_{\min}\) and the rightmost city \(x_{\max}\), two edge-disjoint paths are required. On a straight line, the cost of a path between two points is at least the distance between them \(x_{\max} - x_{\min}\), regardless of which intermediate points are visited (by the triangle inequality).
Therefore, the lower bound on the cost is \(2 \times (x_{\max} - x_{\min})\).
Constructing the Upper Bound (Achieving the Optimal Solution)
Sort the cities by coordinate as \(x_1 < x_2 < \cdots < x_n\), and consider a Hamiltonian cycle (a tour visiting all cities in coordinate order):
\[x_1 \to x_2 \to x_3 \to \cdots \to x_n \to x_1\]
The cost of this cycle is: - Forward path: \((x_2 - x_1) + (x_3 - x_2) + \cdots + (x_n - x_{n-1}) = x_n - x_1\) (telescoping) - Closing edge: \(x_n - x_1\)
Total: \(2(x_n - x_1) = 2(x_{\max} - x_{\min})\), which matches the lower bound.
Furthermore, a cycle on \(n \geq 3\) vertices is 2-vertex-connected (removing any single vertex leaves a path, which is connected).
Conclusion
Since the lower bound and upper bound coincide, the minimum cost is \(2 \times (\max(X_i) - \min(X_i))\).
Algorithm
- Read the coordinates of all cities and find the minimum \(\min\) and maximum \(\max\).
- Output \(2 \times (\max - \min)\).
Sorting is not even necessary; only the minimum and maximum values are needed.
Complexity
- Time complexity: \(O(N)\) (just a single pass through all coordinates)
- Space complexity: \(O(1)\) (no need to store the coordinates)
Implementation Notes
Since \(X_i\) can be up to \(10^9\), the answer can be up to \(2 \times 10^9\), so
long longshould be used.There is no need to store all city coordinates; simply update the minimum and maximum values while reading input. This ensures fast execution and low memory usage even for \(N = 10^6\).
Source Code
#include <bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
long long mn = LLONG_MAX, mx = LLONG_MIN;
for(int i = 0; i < n; i++){
long long x;
cin >> x;
mn = min(mn, x);
mx = max(mx, x);
}
cout << 2LL * (mx - mn) << "\n";
return 0;
}
This editorial was generated by claude4.6opus-thinking.
posted:
last update: