https://vjudge.net/problem/UVA-11383

题意:

给定一个N×N矩阵,每个格子里都有一个正整数W(i,j)。你的任务是给每行确定一个整数row(i),每列也确定一个整数col(i),使得对于任意格子(i,j),w(i,j)<=row(i)+col(j)。所有的row(i)和col(i)只和应尽量小。

思路:

利用二分图最佳完美匹配当中的l(x)+l(y)>=w(i,j),直接用KM算法即可。

  1 #include<iostream>
  2 #include<string>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<queue>
  6 #include<cstdio>
  7 using namespace std;
  8 const int maxn=500+5;
  9
 10 int W[maxn][maxn], n;
 11 int Lx[maxn];
 12 int Ly[maxn];
 13 int Left[maxn];
 14 bool S[maxn], T[maxn];
 15
 16 bool Match(int i)
 17 {
 18     S[i] = true;
 19     for (int j = 1; j <= n; j++)
 20     {
 21         if (Lx[i] + Ly[j] == W[i][j] && !T[j])
 22         {
 23             T[j] = true;
 24             if (!Left[j] || Match(Left[j]))
 25             {
 26                 Left[j] = i;
 27                 return true;
 28             }
 29         }
 30     }
 31     return false;
 32 }
 33
 34 void Update()
 35 {
 36     int a = 1 << 30;
 37     for (int i = 1; i <= n; i++)
 38     {
 39         if (S[i])
 40         {
 41             for (int j = 1; j <= n; j++)
 42             {
 43                 if (!T[j])
 44                 {
 45                     a = min(a, Lx[i] + Ly[j] - W[i][j]);
 46                 }
 47             }
 48         }
 49     }
 50     for (int i = 1; i <= n; i++)
 51     {
 52         if (S[i])
 53             Lx[i] -= a;
 54         if (T[i])
 55             Ly[i] += a;
 56     }
 57 }
 58
 59 void KM()
 60 {
 61     for (int i = 1; i <= n; i++)
 62     {
 63         Left[i] = 0;
 64         Lx[i] = 0;
 65         Ly[i] = 0;
 66         for (int j = 1; j <= n; j++)
 67         {
 68             Lx[i] = max(Lx[i], W[i][j]);
 69         }
 70     }
 71     for (int i = 1; i <= n; i++)
 72     {
 73         while (true)
 74         {
 75             memset(S, 0, sizeof(S));
 76             memset(T, 0, sizeof(T));
 77             if (Match(i))
 78                 break;
 79             else
 80                 Update();
 81         }
 82     }
 83 }
 84
 85 int main()
 86 {
 87     //freopen("D:\\input.txt","r",stdin);
 88     while(~scanf("%d",&n))
 89     {
 90         for(int i=1;i<=n;i++)
 91         {
 92             for(int j=1;j<=n;j++)
 93                 scanf("%d",&W[i][j]);
 94         }
 95         int ans=0;
 96         KM();
 97         for(int i=1;i<=n;i++)
 98         {
 99             printf("%d%c", Lx[i], i == n ? '\n' : ' ');
100             ans+=Lx[i];
101         }
102         for(int i=1;i<=n;i++)
103         {
104              printf("%d%c", Ly[i], i == n ? '\n' : ' ');
105             ans+=Ly[i];
106         }
107         printf("%d\n",ans);
108     }
109     return 0;
110 }

转载于:https://www.cnblogs.com/zyb993963526/p/6883944.html

UVa 11383 少林决胜(二分图最佳完美匹配)相关推荐

  1. UVA - 1045 The Great Wall Game(二分图最佳完美匹配)

    题目大意:给出棋盘上的N个点的位置.如今问将这些点排成一行或者一列.或者对角线的最小移动步数(每一个点都仅仅能上下左右移动.一次移动一个) 解题思路:暴力+二分图最佳完美匹配 #include < ...

  2. 二分图最佳完美匹配——KM算法总结

    KM 算法 求解二分图最佳完美匹配的算法. 先来看一道例题Hdu 2255. 显然是KM的裸题.假设我们要匹配集合X和Y的点,先给每个点一个顶标Lx和Ly. 为什么要给顶标? 首先顶标是我们限制边的一 ...

  3. 二分图最佳完美匹配——KM算法

    前情概要 学km算法之前,笔者还是希望大家已经掌握了匈牙利算法--也就是对于求解二分图最大匹配的算法.学习本算法的前提除了已经掌握C++语言之外,还需要掌握邻接表存图法,不会的朋友这里有传送门 [微笑 ...

  4. 图论--二分图最佳完美匹配(KM模板)

    #include <iostream> #include <cstring> #include <cstdio>using namespace std; const ...

  5. 二分图的最佳完美匹配(模板)

    二分图的最佳完美匹配,也就是带权值的无向二分图中权值之和最大的完美匹配,整个图分为两个不相交的集合x和y,采用KM算法求解,也称匈牙利算法. 时间复杂度为O(n^3) typedef int type ...

  6. hdu-3488-Tour(KM最佳完美匹配)

    题意:有N个城市,M条街道,每条街道是单向的,现在要你设计多条路线覆盖所有的点,每条路线都是一个环,并且每个点仅能被一条路线覆盖且只经过一次(终始点除外) 分析:因为是有向圈,所以每个点的入度和出度应 ...

  7. Uvalive 4043 - Ants(二分图完美匹配)

    题目链接 https://vjudge.net/problem/UVALive-4043 [题意]        给出n个白点和n个黑点的坐标,要求用n条不相交的线段把它们连起来,其中每条线段恰好连接 ...

  8. 【HDU 2255】奔小康赚大钱 (最佳二分匹配KM算法)

    奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  9. UVA 11383 - Golden Tiger Claw(二分图完美匹配扩展)

    UVA 11383 - Golden Tiger Claw 题目链接 题意:给定每列和每行的和,给定一个矩阵,要求每一个格子(x, y)的值小于row(i) + col(j),求一种方案,而且全部行列 ...

最新文章

  1. mysql数据库中nchar_MySQL数据库中CHAR与VARCHAR之争
  2. 什么原因导致芯片短路_常见的芯片故障现象
  3. linux 设置网络
  4. pcm 采样率转换_PCM编码与Waveform音频文件(.wav)格式详解
  5. Spring Mobile 1.1.0.RC1 和 1.0.2 发布
  6. Keras官方中文文档:Keras安装和配置指南(Windows)
  7. Codeforces.700E.Cool Slogans(后缀自动机 线段树合并 DP)
  8. 配好lsd_slam后的使用PTAM工具标定相机
  9. python数据分析与可视化答案学堂云_智慧树知到_Python数据分析与数据可视化_最新答案...
  10. 为什么镜子里的影像左右颠倒而不是上下颠倒 - Google 谷歌 百度 baidu 阿里巴巴 alibaba 微软 华
  11. OSI体系结构——数据链路层详解
  12. 蜂巢3.0(原 素材管理器)开发笔记
  13. excel数据核对技巧:如何用函数公式标识输入正误
  14. 加快SP3下载速度并使用第三方系统主题!适用于XP SP3的TCPIP连接数与主题破解增强补丁下载...
  15. redis的sentinel mode
  16. 网易im聊天室的集成
  17. 打印机驱动正在使用无法删除的解决方案
  18. arm-linux东东之nand之一:nand 初始化
  19. 计算机教室场地技术条,特殊教育学校功能室建设标准
  20. 什么是大数据?带你深度了解大数据

热门文章

  1. 华为鸿蒙万物互联应用,为什么我需要万物互联? 鸿蒙能带来什么?
  2. mysql如何大矩阵_如何打印矩阵
  3. matlab 读取图片后分区域编号_你的第一个有限元求解器——仅十行MATLAB代码
  4. go 是常驻内存吗_图解 Go 内存分配器
  5. finallshell使用_FinalShell使用---Xshell的良心国产软件
  6. mysql scale,Mailchimp Scale:a MySQL Perspective
  7. C语言排序方法-----直接插入排序
  8. python多维矩阵基础运算中的一点困惑
  9. 深度学习前人精度很高了怎么创新?
  10. Excel进行粗糙的快速更换图片背景颜色