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;
    }
  • 相关阅读:
    进制转化
    8.28总结前日及今日
    Uva1213(线性筛模板+dp)
    Uva1363(余数性质/减少枚举量)
    Uva1640(统计数字出现的次数)
    Uva1639(概率期望/对数处理避免丢失精度)
    Uva12034 (组合数取模)
    Uva10820 欧拉公式模板(求小于n且与n互素的数的个数)
    Uva1635 二项式递推+质因子分解+整数因子分解
    8.19总结今日
  • 原文地址:https://www.cnblogs.com/hua-dong/p/9914048.html
Copyright © 2011-2022 走看看