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

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

代码:

  1 #include
  2 #include
  3 #include
  4 #include
  5 #include
  6 #include
  7 #include<set>
  8 #include
  9 #include
 10 #include
 11 #include<string>
 12 #include
 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 ) {
 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 ) {
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 }

永远热爱,永远向着光。

Original: https://www.cnblogs.com/wabi/p/16540572.html
Author: Kyrizer_W
Title: 2022杭电多校第四场C-Magic(差分约束)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/587868/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球