#include<bits/stdc++.h> usingnamespace std; #define int long long structnode { int u, v, w; }edges[5555]; int n, m; int dist[5555]; signedmain() { cin >> n >> m; for (int i = 1; i <= m; i++) { cin >> edges[i].v >> edges[i].u >> edges[i].w; } for (int i = 1; i <= n; i++) { dist[i] = 1e9; } dist[1] = 0; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { dist[edges[j].v] = min(dist[edges[j].v], dist[edges[j].u] + edges[j].w); } } for (int i = 1; i <= m; i++) { if (dist[edges[i].v] > dist[edges[i].u] + edges[i].w) { cout << "NO"; return0; } } for (int i = 1; i <= n; i++) { cout << dist[i] << ' '; } return0; }
好困啊 这个代码调了半个小时 赶紧写完这一篇洗洗睡了
今晚(准确来说现在已经第二天了)的G题
题目描述
您将得到一个整数 N 和长度为 M 的整数序列 L=(L1,L2,…,LM) 、 R=(R1,R2,…,RM) 和 S=(S1,S2,…,SM) 。
#include<bits/stdc++.h> usingnamespace std; #define int long long structnode { int u, v; int w; }; signedmain() { int n, m; cin >> n >> m; vector<int> l(m), r(m), s(m); for (int i = 0; i < m; i++) { cin >> l[i] >> r[i] >> s[i]; int len = r[i] - l[i] + 1; if (s[i] < len) { cout << -1; return0; } } vector<node> edges; for (int i = 1; i <= n; i++) { edges.push_back({i - 1, i, 1}); } for (int i = 0; i < m; i++) { int u = l[i] - 1; int v = r[i]; int nex = s[i]; edges.push_back({u, v, nex}); edges.push_back({v, u, -nex}); } int v = n + 1; vector<int> dist(v, -1e18); dist[0] = 0; for (int i = 0; i < v - 1; i++) { bool flag = 0; for (int i = 0; i < edges.size(); i++) { auto nex = edges[i]; if (dist[nex.u] != -1e18 && dist[nex.v] < dist[nex.u] + nex.w) { dist[nex.v] = dist[nex.u] + nex.w; flag = 1; } } if (!flag) { break; } } bool check = 0; for (int i = 0; i < edges.size(); i++) { auto nex = edges[i]; if (dist[nex.u] != -1e18 && dist[nex.v] < dist[nex.u] + nex.w) { check = 1; break; } } if (check) { cout << -1; } else { cout << dist[n]; } return0; }