hdu 2853 Assignment KM算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2853
We have N companies of troops and M missions, M>=N. One
company can get only one mission. One mission can be assigned to only one
company. If company i takes mission j, we can get efficiency Eij.
We have a
assignment plan already, and now we want to change some companies’ missions to
make the total efficiency larger. And also we want to change as less companies
as possible.
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<cstdlib>
- #include<cmath>
- #include<algorithm>
- #define inf 0x7fffffff
- using namespace std;
- const int maxn=;
- int n,m,k,sum;
- int lx[maxn],ly[maxn],visx[maxn],visy[maxn];
- int link[maxn],slack[maxn],w[maxn][maxn];
- int vis[maxn][maxn];
- int dfs(int x)
- {
- visx[x]=;
- for (int y= ;y<=m ;y++)
- {
- if (visy[y]) continue;
- int t=lx[x]+ly[y]-w[x][y];
- if (t==)
- {
- visy[y]=;
- if (link[y]==- || dfs(link[y]))
- {
- link[y]=x;
- return ;
- }
- }
- else if (slack[y]>t) slack[y]=t;
- }
- return ;
- }
- void KM()
- {
- memset(link,-,sizeof(link));
- memset(ly,,sizeof(ly));
- for (int i= ;i<=n ;i++)
- {
- lx[i]=-inf;
- for (int j= ;j<=m ;j++)
- lx[i]=max(lx[i],w[i][j]);
- }
- for (int x= ;x<=n ;x++)
- {
- for (int i= ;i<=m ;i++) slack[i]=inf;
- while ()
- {
- memset(visx,,sizeof(visx));
- memset(visy,,sizeof(visy));
- if (dfs(x)) break;
- int d=inf;
- for (int i= ;i<=m ;i++)
- {
- if (!visy[i] && slack[i]<d) d=slack[i];
- }
- for (int i= ;i<=n ;i++)
- if (visx[i]) lx[i] -= d;
- for (int i= ;i<=m ;i++)
- {
- if (visy[i]) ly[i] += d;
- else slack[i] -= d;
- }
- }
- }
- int ans=,cnt=;
- for (int i= ;i<=m ;i++)
- {
- if (link[i]!=-)
- {
- ans += w[link[i] ][i];
- if (vis[link[i] ][i]) cnt++;
- }
- }
- printf("%d %d\n",n-cnt,ans-sum-cnt);
- // for (int i=1 ;i<=m ;i++)
- // {
- // if (link[i]!=-1) ans += w[link[i] ][i];
- // }
- // printf("%d %d\n",n-ans%k,ans/k-sum);
- }
- int main()
- {
- while (scanf("%d%d",&n,&m)!=EOF)
- {
- memset(w,,sizeof(w));
- memset(vis,,sizeof(vis));
- k=;
- for (int i= ;i<=n ;i++)
- {
- for (int j= ;j<=m ;j++)
- {
- scanf("%d",&w[i][j]);
- /// w[i][j] *= k;
- }
- }
- int a;
- sum=;
- for (int i= ;i<=n ;i++)
- {
- scanf("%d",&a);
- sum += w[i][a];
- ///sum += w[i][a]/k;
- w[i][a] ++ ;
- vis[i][a]=;
- }
- KM();
- }
- return ;
- }
方法二:和方法一的区别就在于对每条边都乘以k(比如k=200),对于原有匹配w[x][y]++,最后的答案最大效率为ans。
那么差值=ans/k-sum;个数=n-ans%k。
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<cstdlib>
- #include<cmath>
- #include<algorithm>
- #define inf 0x7fffffff
- using namespace std;
- const int maxn=;
- int n,m,k,sum;
- int lx[maxn],ly[maxn],visx[maxn],visy[maxn];
- int link[maxn],slack[maxn],w[maxn][maxn];
- int dfs(int x)
- {
- visx[x]=;
- for (int y= ;y<=m ;y++)
- {
- if (visy[y]) continue;
- int t=lx[x]+ly[y]-w[x][y];
- if (t==)
- {
- visy[y]=;
- if (link[y]==- || dfs(link[y]))
- {
- link[y]=x;
- return ;
- }
- }
- else if (slack[y]>t) slack[y]=t;
- }
- return ;
- }
- void KM()
- {
- memset(link,-,sizeof(link));
- memset(ly,,sizeof(ly));
- for (int i= ;i<=n ;i++)
- {
- lx[i]=-inf;
- for (int j= ;j<=m ;j++)
- lx[i]=max(lx[i],w[i][j]);
- }
- for (int x= ;x<=n ;x++)
- {
- for (int i= ;i<=m ;i++) slack[i]=inf;
- while ()
- {
- memset(visx,,sizeof(visx));
- memset(visy,,sizeof(visy));
- if (dfs(x)) break;
- int d=inf;
- for (int i= ;i<=m ;i++)
- {
- if (!visy[i] && slack[i]<d) d=slack[i];
- }
- for (int i= ;i<=n ;i++)
- if (visx[i]) lx[i] -= d;
- for (int i= ;i<=m ;i++)
- {
- if (visy[i]) ly[i] += d;
- else slack[i] -= d;
- }
- }
- }
- int ans=,cnt=;
- for (int i= ;i<=m ;i++)
- {
- if (link[i]!=-) ans += w[link[i] ][i];
- }
- printf("%d %d\n",n-ans%k,ans/k-sum);
- }
- int main()
- {
- while (scanf("%d%d",&n,&m)!=EOF)
- {
- memset(w,,sizeof(w));
- k=;
- for (int i= ;i<=n ;i++)
- {
- for (int j= ;j<=m ;j++)
- {
- scanf("%d",&w[i][j]);
- w[i][j] *= k;
- }
- }
- int a;
- sum=;
- for (int i= ;i<=n ;i++)
- {
- scanf("%d",&a);
- sum += w[i][a]/k;
- w[i][a] ++ ;
- }
- KM();
- }
- return ;
- }
hdu 2853 Assignment KM算法的更多相关文章
- 【HDU 2853】 KM算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2853 题意:有n个公司,m个任务,每个公司做每个任务都有一个效率值,最开始每个公司都指派了一个任务,现 ...
- HDU 2853 Assignment(KM最大匹配好题)
HDU 2853 Assignment 题目链接 题意:如今有N个部队和M个任务(M>=N),每一个部队完毕每一个任务有一点的效率,效率越高越好.可是部队已经安排了一定的计划,这时须要我们尽量用 ...
- HDU(2255),KM算法,最大权匹配
题目链接 奔小康赚大钱 Time Limit: 1000/1000MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Su ...
- HDU 2853 最大匹配&KM模板
http://acm.hdu.edu.cn/showproblem.php?pid=2853 这道题初看了没有思路,一直想的用网络流如何解决 参考了潘大神牌题解才懂的 最大匹配问题KM 还需要一些技巧 ...
- HDU 2853 & 剩余系+KM模板
题意: 给你一张二分图,给一个原匹配,求原匹配改动最少的边数使其边权和最大. SOL: 我觉得我的智商还是去搞搞文化课吧..这种题给我独立做我大概只能在暴力优化上下功夫.. 这题的处理方法让我想到了剩 ...
- 【HDU 2853】Assignment (KM)
Assignment Problem Description Last year a terrible earthquake attacked Sichuan province. About 300, ...
- Assignment (HDU 2853 最大权匹配KM)
Assignment Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- Assignment HDU - 2853(二分图匹配 KM 新边旧边)
传送门: Assignment HDU - 2853 题意:题意直接那松神的题意了.给了你n个公司和m个任务,然后给你了每个公司处理每个任务的效率.然后他已经给你了每个公司的分配方案,让你求出最多能增 ...
- hdu 2426 Interesting Housing Problem 最大权匹配KM算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2426 For any school, it is hard to find a feasible ac ...
随机推荐
- C# .Net三层架构[转]
C# .Net三层架构[转] 编写人:CC阿爸 2014-3-14 希望朋友们留下自己对三层架构的理解... 三层体系结构的概念 用户界面表示层(USL) 业务逻辑层(BLL) 数据访问层(D ...
- vue中的重要特性
一.vue中的自定义组件 html的代码: <!DOCTYPE html> <html lang="en"> <head> <meta c ...
- RecyclerView中显示不同的item
测试代码: activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/an ...
- Java 第七天 动态代理
代理类需实现InvocationHandler接口: public interface InvocationHandler { public Object invoke(Object proxy,Me ...
- python内建函数-数字相关
本篇对于数字有关的内置函数进行总结. 数字包括 int() , long() , float() , complex() ,这些函数都能够用来进行数值类型的转换.同时这些函数也接受字符串参数,返回字符 ...
- Linux环境下常用regexp的使用
正则表达式 REGular EXPression 的简写元字符 匹配次数 位置锚定 分组 --------------------------------------元字符. 匹配任意单个字符 [ ...
- 切换两个activity
下面是一个切换两个activity是过度动画效果实例:(注意里面的overridePendingTransition()方法)Java代码 1. @Override public void onCre ...
- Oracle12C的EM无法访问怎么办?
装完Oracle 12c,想体验下EM Express,缺发现不能用,应该怎么办?12c的EM 不再像以前版本配置那么麻烦,当然提供的功能也没有那么多了,只需要启用对应端口即可,请看:To manua ...
- python数组的使用
python数组的使用 2010-07-28 17:17 1.Python的数组分三种类型:(1) list 普通的链表,初始化后可以通过特定方法动态增加元素.定义方式:arr = [元素] (2) ...
- [转]IIS部署托管管道模式的集成和经典区别
关于ESPS和SCSJ在Windows server 2008的问题总结 SCSJ出现的问题在于集成模式和经典模式的选择上,系统本身是没有问题的.我们在部署系统的时候,选择了集成模式,导致WebCon ...