fork download
  1. #include <iostream>
  2. #include <vector>
  3. #include <queue>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. const int MAXN = 3005;
  9. const long long INF = 1e18;
  10. int A[MAXN][MAXN];
  11. long long dist_tree[MAXN];
  12. int min_edge[MAXN];
  13. int parent[MAXN];
  14. bool vis[MAXN];
  15. vector<pair<int, int>> adj[MAXN];
  16. int N;
  17.  
  18. bool verify(int root) {
  19. for (int i = 1; i <= N; ++i) dist_tree[i] = -1;
  20. queue<int> q;
  21. q.push(root);
  22. dist_tree[root] = 0;
  23.  
  24. while (!q.empty()) {
  25. int u = q.front();
  26. q.pop();
  27.  
  28. if (dist_tree[u] != A[root][u]) return false;
  29.  
  30. for (auto& edge : adj[u]) {
  31. int v = edge.first;
  32. int w = edge.second;
  33. if (dist_tree[v] == -1) {
  34. dist_tree[v] = dist_tree[u] + w;
  35. q.push(v);
  36. }
  37. }
  38. }
  39.  
  40. for(int i = 1; i <= N; ++i) {
  41. if(dist_tree[i] == -1) return false;
  42. }
  43.  
  44. return true;
  45. }
  46.  
  47. int main() {
  48. ios::sync_with_stdio(false);
  49. cin.tie(nullptr);
  50.  
  51. if (!(cin >> N)) return 0;
  52.  
  53. for (int i = 1; i < N; ++i) {
  54. for (int j = i + 1; j <= N; ++j) {
  55. cin >> A[i][j];
  56. A[j][i] = A[i][j];
  57. }
  58. }
  59.  
  60. for (int i = 1; i <= N; ++i) {
  61. min_edge[i] = 20000;
  62. vis[i] = false;
  63. }
  64.  
  65. min_edge[1] = 0;
  66. for (int i = 0; i < N; ++i) {
  67. int u = -1;
  68. for (int j = 1; j <= N; ++j) {
  69. if (!vis[j] && (u == -1 || min_edge[j] < min_edge[u])) {
  70. u = j;
  71. }
  72. }
  73.  
  74. if (u == -1 || min_edge[u] == 20000 && i > 0) {
  75. cout << "No" << endl;
  76. return 0;
  77. }
  78.  
  79. vis[u] = true;
  80. if (parent[u] != 0) {
  81. adj[parent[u]].push_back({u, min_edge[u]});
  82. adj[u].push_back({parent[u], min_edge[u]});
  83. }
  84.  
  85. for (int v = 1; v <= N; ++v) {
  86. if (!vis[v] && A[u][v] < min_edge[v]) {
  87. min_edge[v] = A[u][v];
  88. parent[v] = u;
  89. }
  90. }
  91. }
  92.  
  93. for (int i = 1; i <= N; ++i) {
  94. if (!verify(i)) {
  95. cout << "No" << endl;
  96. return 0;
  97. }
  98. }
  99.  
  100. cout << "Yes" << endl;
  101. return 0;
  102. }
Success #stdin #stdout 0.01s 5288KB
stdin
10
1039 1802 3781 231 5828 1944 392 262 1481
763 2742 1270 4789 905 1431 1301 442
1979 2033 5552 142 2194 2064 1205
4012 7531 2121 4173 4043 3184
6059 2175 161 493 1712
5694 6220 6090 5231
2336 2206 1347
654 1873
1743
stdout
Yes