• 【hdu 6214】Smallest Minimum Cut


    【链接】 我是链接,点我呀:)
    【题意】

    求最小割中最少的边数。

    【题解】

    模板题

    【代码】

    const int INF = 1e9;
    const int maxn = 1e3 + 7;
    const int maxv = 2e4 + 5;
    int head[maxv], cur[maxv], d[maxv], s, t, k, k1, sum, book[maxn];
    int n, m;
    void init()
    {
        k = 0;
        memset(head, -1, sizeof(head));
    }
    struct node
    {
        int v, w, next;
    }edge[maxv];
    void addEdge(int u, int v, int w)
    {
        edge[k].v = v;
        edge[k].w = w;
        edge[k].next = head[u];
        head[u] = k++;
        edge[k].v = u;
        edge[k].w = 0;
        edge[k].next = head[v];
        head[v] = k++;
    
    }
    int Q[maxv];
    int bfs()
    {
        memset(d, 0, sizeof(d));
        d[s] = 1;
        int frnt = 0, rear = 0;
        Q[rear++] = s;
        while(frnt != rear)
        {
            int u = Q[frnt++];
            if(u == t) return 1;
            for(int i = head[u]; i != -1; i = edge[i].next)
            {
                int to = edge[i].v, w = edge[i].w;
                if(w && d[to] == 0)
                {
                    d[to] = d[u] + 1;
                    if(to == t) return 1;
                    Q[rear++] = to;
                }
            }
        }
        return 0;
    }
    int dfs(int u, int maxflow)
    {
        if(u == t || !maxflow) return maxflow;
        int ret = 0;
        for(int& i = cur[u]; i != -1; i = edge[i].next)
        {
            int to = edge[i].v, w = edge[i].w;
            if(w && d[to] == d[u]+1)
            {
                int f = dfs(to, min(maxflow-ret, w));
                edge[i].w -= f;
                edge[i^1].w += f;
                ret += f;
                if(ret == maxflow) return ret;
            }
        }
        return ret;
    }
    int Dinic()
    {
        int ans = 0;
        while(bfs() == 1)
        {
            memcpy(cur, head, sizeof(head));
            ans += dfs(s, INF);
        }
        return ans;
    }
    int main()
    {
        int _;
        scanf("%d", &_);
        while(_--)
        {
            int x, y, z;
            init();
            scanf("%d%d", &n, &m);
            scanf("%d%d", &s, &t);
            for(int i = 0; i < m; i++)
            {
                scanf("%d%d%d", &x, &y, &z);
                addEdge(x, y, z*(m+1)+1);
            }
            printf("%d
    ", Dinic()%(m+1));
        }
        return 0;
    }
    
    
  • 相关阅读:
    SQL JOB
    Log4net配置
    教你怎么使用Windows7系统自带的备份与还原的方法
    在LINQ TO SQL 中使用MVC3中的DataAnnotations 【MetadataType】
    图片下载
    DOS的一些常用命令
    自动合并多个文件如js css等 可以增加效率
    利用$.getJSON() 跨域请求操作
    在razor中使用递归,巧用递归
    Use ASP.NET and DotNetZip to Create and Extract ZIP Files
  • 原文地址:https://www.cnblogs.com/AWCXV/p/7735104.html
Copyright © 2020-2023  润新知