题意:
      是让你求最小割之后问最小割的最少边数是多少,因为最小割不是唯一的,所以存在最小边数的问法。

思路:
      两个方法,一个是先一遍最大流,然后把割边全都改成流量1,其他的全都改成流量无穷就行了,第二个方法是比较经典的方法,就是把权值放大 *(E+1)+1,最后在对(E+1)取余就行了,这么干其实是同时跑了两遍最大流,只不过是两个权值之间的差距太大,不会相互影响。

#include<queue>
#include<stdio.h>
#include<string.h>

#define N_node 1000 + 5
#define N_edge 400000 + 100
#define INF 2055000000

using namespace std;

typedef struct
{
   int from ,to ,next;
   long long  cost;
}STAR;

typedef struct
{
   int x ,t;
}DEP;

STAR E[N_edge];
DEP xin ,tou;
int list[N_node] ,list2[N_node] ,tot;
int deep[N_node];

void add(int a ,int b ,long long c)
{
   E[++tot].from = a;
   E[tot].to = b;
   E[tot].cost = c;
   E[tot].next = list[a];
   list[a] = tot;
   
   E[++tot].from = b;
   E[tot].to = a;
   E[tot].cost = 0;
   E[tot].next = list[b];
   list[b] = tot;
}

long long minn(long long a ,long long b)
{
   return a < b ? a : b;
}

bool BFS_Deep(int s ,int t ,int n)
{
   memset(deep ,255 ,sizeof(deep));
   xin.x = s ,xin.t = 0;
   deep[s] = 0;
   queue<DEP>q;
   q.push(xin);
   while(!q.empty())
   {
      tou = q.front();
      q.pop();
      
      for(int k = list[tou.x] ;k ;k = E[k].next)
      {
         xin.x = E[k].to;
         xin.t = tou.t + 1;
         if(deep[xin.x] != -1 || !E[k].cost)
         continue;
         deep[xin.x] = xin.t;
         q.push(xin);
      }
   }
   for(int i = 0 ;i <= n ;i ++)
   list2[i] = list[i];
   return deep[t] != -1;
}

long long DFS_Flow(int s ,int t ,long long flow)
{
   if(s == t) return flow;
   long long nowflow = 0;
   for(int k = list2[s] ;k ;k = E[k].next)
   {
      list2[s] = k;
      int to = E[k].to;
      long long c = E[k].cost;
      if(deep[to] != deep[s] + 1 || !c) continue;
      long long tmp = DFS_Flow(to ,t ,minn(c ,flow - nowflow));
      nowflow += tmp;
      E[k].cost -= tmp;
      E[k^1].cost += tmp;
      if(nowflow == flow) break;
   }
   if(!nowflow) deep[s] = 0;
   return nowflow;
}


long long DINIC(int s ,int t ,int n)

{
   long long Ans = 0;
   while(BFS_Deep(s ,t ,n))
   {
      Ans += DFS_Flow(s ,t ,INF);
   }
   return Ans;
}

int main ()
{
    int a ,b ,c ,d;
    int t ,n ,m ,i ,cas = 1;
    scanf("%d" ,&t);
    while(t--)
    {
        scanf("%d %d" ,&n ,&m);
        memset(list ,0 ,sizeof(list));
        tot = 1;
        for(i = 1 ;i <= m ;i ++)
        {
           scanf("%d %d %d %d" ,&a ,&b ,&c ,&d);
           if(d) add(a + 1 ,b + 1 ,(long long)c) ,add(b + 1 ,a + 1 ,c);
           else add(a + 1 ,b + 1 ,(long long)c);
        }
        DINIC(1 ,n ,n);
        for(i = 2 ;i <= tot ;i += 2)
        if(!E[i].cost) E[i].cost = 1 ,E[i^1].cost = 0;
        else E[i].cost = INF ,E[i^1].cost = 0;
        printf("Case %d: %lld\n" ,cas ++ ,DINIC(1 ,n ,n));
     }
     return 0;
}

#include<queue>
#include<stdio.h>
#include<string.h>

#define N_node 1000 + 5
#define N_edge 400000 + 100
#define INF 205500000000000//这个地方记得开大点,因为放大了权值

using namespace std;

typedef struct
{
   int from ,to ,next;
   long long  cost;
}STAR;

typedef struct
{
   int x ,t;
}DEP;

STAR E[N_edge];
DEP xin ,tou;
int list[N_node] ,list2[N_node] ,tot;
int deep[N_node];

void add(int a ,int b ,long long c)
{
   E[++tot].from = a;
   E[tot].to = b;
   E[tot].cost = c;
   E[tot].next = list[a];
   list[a] = tot;

   

   E[++tot].from = b;

   E[tot].to = a;
   E[tot].cost = 0;
   E[tot].next = list[b];
   list[b] = tot;
}

long long minn(long long a ,long long b)
{
   return a < b ? a : b;
}

bool BFS_Deep(int s ,int t ,int n)
{
   memset(deep ,255 ,sizeof(deep));
   xin.x = s ,xin.t = 0;
   deep[s] = 0;
   queue<DEP>q;
   q.push(xin);
   while(!q.empty())
   {
      tou = q.front();
      q.pop();
      
      for(int k = list[tou.x] ;k ;k = E[k].next)
      {
         xin.x = E[k].to;
         xin.t = tou.t + 1;
         if(deep[xin.x] != -1 || !E[k].cost)
         continue;
         deep[xin.x] = xin.t;
         q.push(xin);
      }
   }
   for(int i = 0 ;i <= n ;i ++)
   list2[i] = list[i];
   return deep[t] != -1;
}

long long DFS_Flow(int s ,int t ,long long flow)
{
   if(s == t) return flow;
   long long nowflow = 0;
   for(int k = list2[s] ;k ;k = E[k].next)
   {
      list2[s] = k;
      int to = E[k].to;
      long long c = E[k].cost;
      if(deep[to] != deep[s] + 1 || !c) continue;
      long long tmp = DFS_Flow(to ,t ,minn(c ,flow - nowflow));
      nowflow += tmp;
      E[k].cost -= tmp;
      E[k^1].cost += tmp;
      if(nowflow == flow) break;
   }
   if(!nowflow) deep[s] = 0;
   return nowflow;
}

long long DINIC(int s ,int t ,int n)
{
   long long Ans = 0;
   while(BFS_Deep(s ,t ,n))
   {
      Ans += DFS_Flow(s ,t ,INF);
   }
   return Ans;
}

int main ()
{
    int a ,b ,c ,d;
    int t ,n ,m ,i ,cas = 1;
    scanf("%d" ,&t);
    while(t--)
    {
        scanf("%d %d" ,&n ,&m);
        memset(list ,0 ,sizeof(list));
        tot = 1;
        for(i = 1 ;i <= m ;i ++)
        {
           scanf("%d %d %d %d" ,&a ,&b ,&c ,&d);
           if(d) add(a + 1 ,b + 1 ,(long long)c * 100001 + 1) ,add(b + 1 ,a + 1 ,(long long)c * 100001 + 1);
           else add(a + 1 ,b + 1 ,(long long)c * 100001 + 1);
        }
        printf("Case %d: %lld\n" ,cas ++ ,DINIC(1 ,n ,n) % 100001);
     }
     return 0;
}

hdu3987 最小割边数相关推荐

  1. cstring只获取到第一个数_一文讲透 Dubbo 负载均衡之最小活跃数算法

    (给ImportNew加星标,提高Java技能) 作者:why技术(本文来自作者投稿) 本文是对于Dubbo负载均衡策略之一的最小活跃数算法的详细分析.文中所示源码,没有特别标注的地方均为2.6.0版 ...

  2. (C++)输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换。要求用3个函数实现,分别为输入10个数、进行处理、输出10个数。要求使用指针的方法进行处理。

    #include<cstdio> //输入10个整数,将其中最小的数与第一个数对换,把最大的数与最后一个数对换.要求用3个函数实现,分别为输入10个数.进行处理.输出10个数.要求使用指针 ...

  3. ACMNO.37 C语言-数字交换 输入10个整数,将其中最小的数与第一个数对换,然后把最大的数与最后一个数对换。写三个函数; ①输入10个数;②进行处理;③输出10个数。

    题目描述 输入10个整数,将其中最小的数与第一个数对换,然后把最大的数与最后一个数对换. 写三个函数: ①输入10个数:②进行处理:③输出10个数. 输入 10个整数 输出 整理后的十个数,每个数后跟 ...

  4. LeetCode 31. Next Permutation-- Python 解法--数学题--比当前数大的最小的数

    LeetCode 31. Next Permutation-- Python 解法–数学题–比当前数大的最小的数 此文首发于我的个人博客:LeetCode 31. Next Permutation-- ...

  5. 【剑指offer-Java版】33把数组排成最小的数

    把数组排成最小的数 难点在于比较规则的确定以及比较规则的正确性证明 比如:仅仅是局部的两个数字的顺序较小,如何保证整个数组按此规则进行排序后达到全局的较小 书中关于这一点的证明直接用的反证法,忘的差不 ...

  6. 33:把数组排成最小的数

    /*** 面试题33:把数组排成最小的数* 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.* 例如输入数组{3,32,321},则打印出这三个数字能排成的 ...

  7. 《剑指offer》-- 把数组排成最小的数、丑数、二进制中1的个数、表示数值的字符串、替换空格

    一.把数组排成最小的数: 1.题目: 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为 ...

  8. HDU Problem - 6214 Smallest Minimum Cut(最小割边,两种方法)

    题目链接 Problem Description Consider a network G=(V,E)G=(V,E)G=(V,E) with source sss and sink t" r ...

  9. 算法:把数组排成最小的数

    * @Description 把数组排成最小的数* @问题:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个.* 例如输入数组{3,32,321},则打印出这 ...

最新文章

  1. 【网络】HTTP基础总结
  2. android 点击网络图片大全,android查看网络图片的实现方法
  3. mysql行转列sql函数_sql动态行转列的两种方法
  4. C#的变迁史08 - C# 5.0 之并行编程总结篇
  5. SybaseASE系统表的应用
  6. 干货—MySQL常见的面试题+索引原理分析!
  7. Hive 架构知识体系及语法详解
  8. Python生成器中的send()与next()方法解析
  9. 网络层QoS分类和标记字段详解
  10. 遍历目录下的所有文件(文件)
  11. c语言指针实现字符串拼接
  12. 【转载】详解Android中接口回调、方法回调
  13. 刘彬20000词汇04
  14. FPGA通信第一篇--USB2.0
  15. Linux_rpm安装
  16. RestTemplate上传图片到指定接口
  17. 中国菜刀能在linux上运行吗,【Web Shell】- 技术剖析中国菜刀
  18. 【HTTP】10分钟带你快速了解HTTP中常见的状态码(内附大量实例)
  19. 量化交易 米筐 构建一个完整策略
  20. Kafka 的七年之痒

热门文章

  1. 【安全牛学习笔记】SQLMAP自动注入-REQUEST
  2. node封装mysql模块
  3. http://www.cnblogs.com/Javame/p/3632473.html
  4. 作为前端开发兼任产品专员是一种咋样的体验
  5. 打开 XP Pro SP2 远程桌面的多用户支持
  6. 20175208『Java程序设计』课程 结对编程练习_四则运算
  7. LeetCode 106. 从中序与后序遍历序列构造二叉树(Construct Binary Tree from Inorder and Postorder Traversal)...
  8. mysql五补充部分:SQL逻辑查询语句执行顺序
  9. C# 使用FileSystemWatcher来监视文件系统的变化
  10. ORACLE DBA的职责