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;
    }
  • 相关阅读:
    Vue 导出excel 自适应宽度
    .Net 5.0 项目数据库连接字符串
    .Net 5.0 从api下载文件到本地
    Oracle for 循环输出(游标提取)
    找到多个与名为“Home”的控制器匹配的类型
    让tomcat使用指定JDK
    .NetCore 3 单文件发布详解
    CentOS7 常用命令大全
    阿里云ECS CentOS 7.8 安装图形化桌面GNOME
    用命令禁用本地连接
  • 原文地址:https://www.cnblogs.com/hua-dong/p/9914048.html
Copyright © 2011-2022 走看看