• 深海机器人问题 【网络流24题】


     

     

     思路

      和方格取数差不多的一道题

      只是输入有点恶心

      然而他好像提示了怎么输出

      之后就是建图标准最大费用最大流了

      不知道为什么spfa的最大流T了一个点

      难道说数据这么丧心病狂吗

      zkw的话倒是50ms就跑完了

    CODE

      1 #include <bits/stdc++.h>
      2 #define dbg(x) cout << #x << "=" << x << endl
      3 
      4 using namespace std;
      5 typedef long long LL;
      6                    
      7 template<class T>inline void read(T &res)
      8 {
      9     char c;T flag=1;
     10     while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';
     11     while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
     12 }
     13 
     14 const int MAXN = 2e3 + 5;
     15 const int inf = 0x3f3f3f3f;
     16 
     17 int N, M;
     18 
     19 struct Edge{
     20     int to, val, cost;
     21     Edge *next, *ops;
     22     Edge(int to, int val, int cost, Edge *next): to(to), val(val), cost(cost), next(next){}
     23 };
     24 
     25 Edge *head[MAXN << 1];
     26 
     27 void BuildGraph(int u, int v, int w, int c) {
     28     head[u] = new Edge(v, w, c, head[u]);
     29     head[v] = new Edge(u, 0, -c, head[v]);
     30     head[u]->ops = head[v]; head[v]->ops = head[u];
     31 }
     32 
     33 namespace zkw{
     34     int s, t, ans, res;
     35     int dis[MAXN << 1];
     36     bool vis[MAXN << 1];
     37     bool Spfa() {
     38         memset(vis, false, sizeof vis);
     39         memset(dis, 0x3f, sizeof dis);
     40         deque<int> q;
     41         q.push_back(s);
     42         vis[s] = true; dis[s] = 0;
     43         while (!q.empty()) {
     44             int u = q.front(); q.pop_front(); vis[u] = false;
     45             for (Edge *e = head[u]; e; e = e->next) {
     46                 int v = e->to;
     47                 if (e->val > 0 && dis[u] + e->cost < dis[v]) {
     48                     dis[v] = dis[u] + e->cost;
     49                     if (!vis[v]) {
     50                         vis[v] = true;
     51                         if (!q.empty() && dis[v] < dis[q.front()]) q.push_front(v);
     52                         else q.push_back(v);
     53                     }
     54                 }
     55             }
     56         }
     57         return dis[t] < inf;
     58     }
     59 
     60     int Dfs(int u, int flow) {
     61         if (u == t) {
     62             vis[u] = true;
     63             res += flow;
     64             return flow;
     65         }
     66         int used = 0; vis[u] = true;
     67         for (Edge *e = head[u]; e; e = e->next) {//当前弧就不加了
     68             int v = e->to;
     69             if ((!vis[v] || v == t) && e->val && dis[u] + e->cost == dis[v]) {
     70                 int mi = Dfs(v, min(e->val, flow - used));
     71                 if (mi) {
     72                     e->val -= mi;
     73                     e->ops->val += mi;
     74                     ans += e->cost * mi;
     75                     used += mi;
     76                 }
     77                 if (used == flow) break;
     78             }
     79         }
     80         return used;
     81     }
     82 
     83     void Work() {
     84         res = 0; ans = 0;
     85         while (Spfa()) {
     86             vis[t] = true;
     87             while (vis[t]) {
     88                 memset(vis, false, sizeof vis);
     89                 Dfs(s, inf);
     90             }
     91         }
     92     }
     93 }
     94 
     95 int A, B, n, m;
     96 int table[20][20];
     97 int times = 0;
     98 
     99 signed main()  
    100 {
    101     //freopen("data.txt", "r", stdin);
    102     read(A); read(B);
    103     read(n); read(m);
    104     for ( int i = 0; i <= n; ++i ) {
    105         for ( int j = 0; j <= m; ++j ) {
    106             table[i][j] = ++times;
    107         }
    108     }
    109     int x;
    110     int s, t;
    111     s = 0, t = (n + 1) * (m + 1) + 1;
    112     zkw::s = s, zkw::t = t;
    113     for ( int i = 0; i <= n; ++i ) {
    114         for ( int j = 0; j <= m - 1; ++j ) {
    115             read(x);
    116             BuildGraph(table[i][j], table[i][j+1], inf, 0);
    117             BuildGraph(table[i][j], table[i][j + 1], 1, -x);
    118         }
    119     }
    120     for ( int j = 0; j <= m; ++j ) {
    121         for ( int i = 0; i <= n - 1; ++i ) {
    122             read(x);
    123             BuildGraph(table[i][j], table[i+1][j], inf, 0);
    124             BuildGraph(table[i][j], table[i+1][j], 1, -x);
    125         }
    126     }
    127     for ( int i = 1; i <= A; ++i ) {
    128         int x, y, num;
    129         read(num); read(x); read(y);
    130         BuildGraph(s, table[x][y], num, 0);
    131     }
    132     for ( int i = 1; i <= B; ++i ) {
    133         int x, y, num;
    134         read(num); read(x); read(y);
    135         //dbg(num);
    136         BuildGraph(table[x][y], t, num, 0);
    137     }
    138     zkw::Work();
    139     int ans = -zkw::ans;
    140     cout << ans << endl;
    141     return 0;
    142 }
    View Code
  • 相关阅读:
    串口RS232和485通信的波形分析
    Ubuntu添加中文输入法
    虚拟机桥接模式联网方法,Xshell的连接与使用
    waitpid 函数详解
    linux for循环 fork() 产生子进程
    【LeetCode解题总结】动态规划篇
    【LeetCode解题总结】递归篇
    【LeetCode解题总结】排序篇
    【LeetCode解题总结】树/图篇
    【LeetCode解题总结】栈/队列篇
  • 原文地址:https://www.cnblogs.com/orangeko/p/12826402.html
Copyright © 2020-2023  润新知