2022杭电多校第四场C-Magic(差分约束)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=7176

代码:

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<algorithm>
  4 #include<vector>
  5 #include<map>
  6 #include<queue>
  7 #include<set>
  8 #include<cmath>
  9 #include<list>
 10 #include<cstring>
 11 #include<string>
 12 #include<stack>
 13 #define ll long long
 14 #define ull unsigned long long
 15 #define inf 0x3f3f3f3f
 16 #define inff 0x7fffffff
 17 using namespace std;
 18 const int N = 100000 + 10;
 19 
 20 int n, k;
 21 
 22 struct node {
 23     int to, w, next;
 24 }edge[N];
 25 
 26 int head[N];
 27 int cnt;
 28 
 29 void add(int u, int v, int w) {
 30     edge[cnt].w = w;
 31     edge[cnt].to = v;
 32     edge[cnt].next = head[u];
 33     head[u] = cnt++;
 34 }
 35 
 36 int In[N];
 37 int dis[N];
 38 int vis[N];
 39 
 40 bool spfa(int s) {
 41 
 42     queue<int>q;
 43     memset(vis, 0, sizeof(vis));
 44     memset(dis, 0x3f, sizeof(dis));
 45     memset(In, 0, sizeof(In));
 46 
 47     q.push(s);
 48     vis[s] = true;
 49     dis[s] = 0;
 50     In[s]++;
 51 
 52     while (!q.empty()) {
 53 
 54         int tmp = q.front();
 55         q.pop();
 56         vis[tmp] = false;
 57         for (int i = head[tmp]; i != -1; i = edge[i].next) {
 58 
 59             int to = edge[i].to;
 60             int disto = edge[i].w;
 61             if (dis[to] > dis[tmp] + disto) {
 62                 dis[to] = dis[tmp] + disto;
 63                 if (!vis[to]) {
 64                     vis[to] = true;
 65                     q.push(to);
 66                     if (++In[to] > n + 1) return false;
 67                 }
 68             }
 69 
 70         }
 71     }
 72 
 73     return true;
 74 }
 75 
 76 int main() {
 77 
 78     ios::sync_with_stdio(false);
 79     cin.tie(0), cout.tie(0);
 80 
 81     int T;
 82     cin >> T;
 83     while (T--) {
 84         cin >> n >> k;
 85         int p, q;
 86         memset(head, -1, sizeof(head));
 87         //memset(edge, 0, sizeof(edge));
 88         cnt = 0;
 89         for (int i = 1; i <= n; i++) {
 90             cin >> p;
 91             int rt = min(i + k - 1, n);
 92             int lt = max(i - k, 0);
 93             add(rt, lt, -p);
 94             add(i, i - 1, 0);
 95         }
 96         cin >> q;
 97         for (; q; --q) {
 98             int l, r, b;
 99             cin >> l >> r >> b;
100             add(l - 1, r, b);
101         }
102         for (int i = 1; i <= n; i++) {
103             add(n + 1, i, 0);
104         }
105         if (!spfa(n)) cout << -1 << "\n";
106         else {
107             cout << -dis[0] << "\n";
108         }
109     }
110 
111 
112     return 0;
113 }

 

 
posted @ 2022-08-01 15:44  Keyzee  阅读(91)  评论(0编辑  收藏  举报