zoukankan      html  css  js  c++  java
  • hdu4888 Redraw Beautiful Drawings

    14更多学校的第二个问题

    网络流量   分别以行,列作为结点建图

    i行表示的结点到j列表示的结点的流量便是(i, j)的值

    跑遍最大流   若满流了便是有解   推断是否unique  就是在残余网络中dfs。走能够添加流量的边,找到环即不唯一

    dfs的时候一定要回溯!!

    。。


    #include <cstdio>
    #include <ctime>
    #include <cstdlib>
    #include <cstring>
    #include <queue>
    #include <string>
    #include <set>
    #include <stack>
    #include <map>
    #include <cmath>
    #include <vector>
    #include <iostream>
    #include <algorithm>
    #include <bitset>
    #include <fstream>
    using namespace std;
    
    
    //LOOP
    #define FF(i, a, b) for(int i = (a); i < (b); ++i)
    #define FE(i, a, b) for(int i = (a); i <= (b); ++i)
    #define FED(i, b, a) for(int i = (b); i>= (a); --i)
    #define REP(i, N) for(int i = 0; i < (N); ++i)
    #define CLR(A,value) memset(A,value,sizeof(A))
    #define FC(it, c) for(__typeof((c).begin()) it = (c).begin(); it != (c).end(); it++)
    
    
    //OTHER
    #define SZ(V) (int)V.size()
    #define PB push_back
    #define MP make_pair
    #define all(x) (x).begin(),(x).end()
    
    
    //INPUT
    #define RI(n) scanf("%d", &n)
    #define RII(n, m) scanf("%d%d", &n, &m)
    #define RIII(n, m, k) scanf("%d%d%d", &n, &m, &k)
    #define RIV(n, m, k, p) scanf("%d%d%d%d", &n, &m, &k, &p)
    #define RV(n, m, k, p, q) scanf("%d%d%d%d%d", &n, &m, &k, &p, &q)
    #define RS(s) scanf("%s", s)
    
    
    //OUTPUT
    #define WI(n) printf("%d
    ", n)
    #define WS(n) printf("%s
    ", n)
    
    
    //debug
    //#define online_judge
    #ifndef online_judge
    #define dt(a)  << (#a) << "=" << a << " "
    #define debugI(a) cout dt(a) << endl
    #define debugII(a, b) cout dt(a) dt(b) << endl
    #define debugIII(a, b, c) cout dt(a) dt(b) dt(c) << endl
    #define debugIV(a, b, c, d) cout dt(a) dt(b) dt(c) dt(d) << endl
    #define debugV(a, b, c, d, e) cout dt(a) dt(b) dt(c) dt(d) dt(e) << endl
    #else
    #define debugI(v)
    #define debugII(a, b)
    #define debugIII(a, b, c)
    #define debugIV(a, b, c, d)
    #endif
    
    #define sqr(x) (x) * (x)
    typedef long long LL;
    typedef unsigned long long ULL;
    typedef vector <int> VI;
    const double eps = 1e-9;
    const int MOD = 1000000007;
    const double PI = acos(-1.0);
    const int INF = 0x3f3f3f3f;
    const int maxn = 900;
    
    bool use[maxn];
    struct Edge{
        int from, to, cap, flow;
    };
    int MAX;
    
    struct Dinic{
        int n, m ,s, t;
        vector<Edge> edges;
        VI G[maxn];
        bool vis[maxn];
        int d[maxn];
        int cur[maxn]   ;
    
        void init(int nn)
        {
            this->n = nn;
            REP(i, n) G[i].clear();
            edges.clear();
        }
    
        void addEdge(int from, int to, int cap)
        {
            edges.PB((Edge){from, to, cap, 0});
            edges.PB((Edge){to, from, 0, 0});
            m = edges.size();
            G[from].PB(m - 2);
            G[to].PB(m - 1);
        }
    
        bool bfs()
        {
            CLR(vis, 0);
            queue<int> Q;
            Q.push(s);
            d[s] = 0;
            vis[s] = 1;
            while (!Q.empty())
            {
                int x = Q.front();
                Q.pop();
                REP(i, G[x].size())
                {
                    Edge& e = edges[G[x][i]];
                    if (!vis[e.to] && e.cap > e.flow)
                    {
                        vis[e.to] = 1;
                        d[e.to] = d[x] + 1;
                        Q.push(e.to);
                    }
                }
            }
            return vis[t];
        }
    
        int dfs(int x, int a)
        {
            if (x == t || a == 0)   return a;
            int flow = 0, f;
            for (int& i = cur[x]; i < G[x].size(); i++)
            {
                Edge& e = edges[G[x][i]];
                if (d[x] + 1 == d[e.to] && (f = dfs(e.to, min(a, e.cap - e.flow))) > 0)
                {
                    e.flow += f;
                    edges[G[x][i] ^ 1].flow -= f;
                    flow += f;
                    a -= f;
                    if (a == 0) break;
                }
            }
            return flow;
        }
    
        int maxflow(int s, int t)
        {
            this-> s = s, this-> t = t;
            int flow = 0;
            while (bfs())
            {
                CLR(cur, 0);
                flow += dfs(s, INF);
            }
            return flow;
        }
    
        bool visit(int u, int fa)
        {
            if (u == 0 || u == MAX) return false;
            use[u] = 1;
            REP(i, G[u].size())
            {
                Edge& e = edges[G[u][i]];
    //            debugII(e.to, use[e.to]);
                if (e.to != fa && e.cap > e.flow)
                    if (use[e.to] || visit(e.to, u))
                        return true;
            }
            use[u] = 0;
            return false;
        }
    
    }di;
    
    int main()
    {
        int n, m, k;
        while (~RIII(n, m, k))
        {
            int x, sum1 = 0, sum2 = 0;
            MAX = n + m + 1;
            di.init(n + m + 2);
            FE(i, 1, n)
            {
                RI(x);
                sum1 += x;
                di.addEdge(0, i, x);
            }
            FE(i, n + 1, n + m)
            {
                RI(x);
                sum2 += x;
                di.addEdge(i, n + m + 1, x);
            }
            FE(i, 1, n)
                FE(j, n + 1, n + m)
                    di.addEdge(i, j, k);
            if (sum2 != sum1)
            {
                puts("Impossible");
                continue;
            }
            int ans = di.maxflow(0, n + m + 1);
            if (ans < sum1)
            {
                puts("Impossible");
                continue;
            }
            FE(i, 1, n)
            {
                CLR(use, 0);
                if (di.visit(i, -1))
                {
                    puts("Not Unique");
                    goto end;
                }
            }
            puts("Unique");
            for (int i = 2 * n + 2 * m; i < di.edges.size(); i += 2)
            {
                printf("%d", di.edges[i].flow);
                if (i + 2 >= di.edges.size())
                    printf("
    ");
                else
                    printf(" ");
            }
            end:;
        }
        return 0;
    }
    


    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    支付宝支付
    django之contenttype
    vue 项目搭建 及基础介绍
    redis续
    1012
    1009
    灾后重建
    FLOYD判圈
    1007
    1006
  • 原文地址:https://www.cnblogs.com/lcchuguo/p/4805264.html
Copyright © 2011-2022 走看看