zoukankan      html  css  js  c++  java
  • HDU

    Consider a network G=(V,EG=(V,E) with source s and sink t . An s-t cut is a partition of nodes set V into two parts such that s and t belong to different parts. The cut set is the subset of E with all edges connecting nodes in different parts. A minimum cut is the one whose cut set has the minimum summation of capacities. The size of a cut is the number of edges in the cut set. Please calculate the smallest size of all minimum cuts.

    InputThe input contains several test cases and the first line is the total number of cases T (1T300T (1≤T≤300) .
    Each case describes a network G , and the first line contains two integers n (2n200n (2≤n≤200) and m (0m1000m (0≤m≤1000) indicating the sizes of nodes and edges. All nodes in the network are labelled from 1 to n .
    The second line contains two different integers s and t (1s,tnt (1≤s,t≤n) corresponding to the source and sink.
    Each of the next m lines contains three integers u,u,v and w (1w255w (1≤w≤255) describing a directed edge from node u to v with capacity w .
    OutputFor each test case, output the smallest size of all minimum cuts in a line.Sample Input

    2
    4 5
    1 4
    1 2 3
    1 3 1
    2 3 1
    2 4 1
    3 4 2
    4 5
    1 4
    1 2 3
    1 3 1
    2 3 1
    2 4 1
    3 4 3

    Sample Output

    2
    3

    题意:给定N点M边的网络,求最小割边的数量,使得S与T不连通。

    思路:百度才知道的。用了数学的思想来搞的,每条边的容量V=V*(M+1)+1,最后的最小割=ans/(M+1),最小割边=ans%(M+1);

    简单说明:肯定是对的,因为V=V*(M+1)+1的这个尾巴“1”数量少于M+1,所以ans/(M+1)显然不会进位,就等于最小割;那么尾巴1的个数就是边数了,ans膜一下(M+1)最小割求出的最少边数。

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=2010;
    const int inf=0x7fffffff;
    int vd[maxn],dis[maxn],Laxt[maxn],Next[maxn],To[maxn],V[maxn];
    int N,M,cnt,ans,S,T;
    void update()
    {
        for(int i=1;i<=N;i++) Laxt[i]=vd[i]=dis[i]=0;
        for(int i=1;i<=cnt;i++) V[i]=0;
        cnt=1; ans=0;
    }
    void add(int u,int v,int c)
    {
        Next[++cnt]=Laxt[u];Laxt[u]=cnt;To[cnt]=v;V[cnt]=c;
        Next[++cnt]=Laxt[v];Laxt[v]=cnt;To[cnt]=u;V[cnt]=0;
    }
    int sap(int u,int flow)
    {
        int tmp,delta=0;
        if(flow==0||u==T) return flow;
        for(int i=Laxt[u];i;i=Next[i])
        {
            if(dis[To[i]]+1==dis[u]&&V[i]>0){
                tmp=sap(To[i],min(flow-delta,V[i]));
                V[i]-=tmp; V[i^1]+=tmp; delta+=tmp;
                if(delta==flow||dis[S]>=N) return delta;
            }
        }
        vd[dis[u]]--;
        if(vd[dis[u]]==0) dis[S]=N;
        vd[++dis[u]]++;
        return delta;
    }
    int main()
    {
         int C,i,j,u,v,w;
         scanf("%d",&C);
         while(C--){
             scanf("%d%d%d%d",&N,&M,&S,&T);
             update();
             for(i=1;i<=M;i++){
                 scanf("%d%d%d",&u,&v,&w);
                 add(u,v,w*(M+1)+1);
             }
             while(dis[S]<N) ans+=sap(S,inf);
             printf("%d
    ",ans%(M+1));
         }
         return 0;
    }
  • 相关阅读:
    Id vs Instancetype
    【转】为什么要走出你的心理“舒适区”
    【转】深入浅出 iOS 之生命周期
    【转】Objective-C类初始化:load与initialize
    【转】Cocoapod 的安装和使用
    非对称加密回顾
    iOS中 Proxy和的delegate区别
    IOS 对JSON解析的要求
    内存对齐规则
    KVO 的进一步理解
  • 原文地址:https://www.cnblogs.com/hua-dong/p/9914048.html
Copyright © 2011-2022 走看看