博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVa 11383 少林决胜(二分图最佳完美匹配)
阅读量:5154 次
发布时间:2019-06-13

本文共 1954 字,大约阅读时间需要 6 分钟。

题意:

给定一个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
2 #include
3 #include
4 #include
5 #include
6 #include
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

你可能感兴趣的文章
Docker入门系列(一):目标和安排
查看>>
爬虫开发.1爬虫介绍
查看>>
Kotlin定义静态变量、静态方法
查看>>
Kafka数据可靠性深度解读
查看>>
struts2基础---->自定义拦截器
查看>>
SDOI2009
查看>>
bzoj3255 一个关于序列的游戏
查看>>
JavaScript总结(四)
查看>>
华为企业互动社区云计算板块
查看>>
[Algorithms] Insertion sort algorithm using TypeScript
查看>>
[Angular Directive] Assign a Structual Directive a Dynamic Context in Angular 2
查看>>
[Angular 2] ng-model and ng-for with Select and Option elements
查看>>
python中浅拷贝和深度拷贝的区别
查看>>
Linux 离线安装软件
查看>>
WordPress WP cleanfix插件‘eval()’函数跨站请求伪造漏洞
查看>>
USACO Broken Necklace
查看>>
中小型网站生存之道
查看>>
如何获取repeater某行第一列的值
查看>>
利用"SQL"语句自动生成序号的两种方式
查看>>
discuz完善用户资料任务不能完成的解决方法
查看>>