虚拟赛一开始lyf就对我说这是一道匹配的题目,我一看明显裸的最优匹配,敲完提交wrong,

题目要求改变尽量少的公司,就是如果遇到相等的权值,优先选择跟他原来匹配的,KM匹配是按序号大小来的,如果一个公司原来匹配的序号较大,前面有权值相等的点时,KM就会选择前面的点参加匹配。想了好长时间不知道怎么去优先选择原来匹配的边,

最后想着如果把原来匹配的边变得大一些的话,就可以,但是变大的话就会影响最优匹配的总值,而且变大的话还会影响原来比他大的权值,所以就是所有的权值都得扩大,我想到的是都*100,原来匹配的边再加1,因为最多选50条边,也就是最多有50个01相加,不会超过一百,得到的答案除以一百,就把加的1都去掉了,只要扩大的倍数大于n就可以,,

#include<stdio.h>
#include<string.h>
#define N 55
#define inf 0x3fffffff
int map[N][N],lx[N],ly[N],sx[N],sy[N],d[N],n,m,match[N],Kmatch[N],tch[N];
int find(int x)
{
sx[x]=1;
for(int i=1;i<=m;i++)
{
if(sy[i]==1)continue;
int temp=lx[x]+ly[i]-map[x][i];
if(temp==0)
{
sy[i]=1;
if(match[i]==-1||find(match[i])==1)
{
match[i]=x;
Kmatch[x]=i;
return 1;
}
}
else d[i]=d[i]>temp?temp:d[i];
}
return 0;
}
int KM()
{
int i,j,k,min,sum;
memset(ly,0,sizeof(ly));
memset(match,-1,sizeof(match));
memset(Kmatch,-1,sizeof(Kmatch));
for(i=1;i<=n;i++)
{
lx[i]=map[i][1];
for(j=2;j<=m;j++)
if(lx[i]<map[i][j])
lx[i]=map[i][j];
}
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
d[j]=inf;
while(1)
{
memset(sx,0,sizeof(sx));
memset(sy,0,sizeof(sy));
if(find(i)==1)break;
min=inf;
for(k=1;k<=m;k++)
if(sy[k]==0&&min>d[k])
min=d[k];
for(j=1;j<=n;j++)
if(sx[j]==1)lx[j]-=min;
for(j=1;j<=m;j++)
if(sy[j]==1)ly[j]+=min;
}
}
sum=0;
for(i=1;i<=n;i++)
sum+=map[i][Kmatch[i]];
return sum;
}
int main()
{
int i,j,k,ans,sum;
while(scanf("%d%d",&n,&m)!=-1)
{
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
map[i][j]=-inf;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
scanf("%d",&map[i][j]);
map[i][j]*=100;
}
ans=0;
for(i=1;i<=n;i++)
{
scanf("%d",&k);
tch[i]=k;
ans+=map[i][k];
map[i][k]++;
}
ans/=100;
sum=KM()/100;
k=0;
for(i=1;i<=n;i++)
if(tch[i]!=Kmatch[i])
k++;
printf("%d %d\n",k,sum-ans);
}
return 0;
}

hdu 2853的更多相关文章

  1. 【HDU 2853】Assignment (KM)

    Assignment Problem Description Last year a terrible earthquake attacked Sichuan province. About 300, ...

  2. HDU 2853 Assignment(KM最大匹配好题)

    HDU 2853 Assignment 题目链接 题意:如今有N个部队和M个任务(M>=N),每一个部队完毕每一个任务有一点的效率,效率越高越好.可是部队已经安排了一定的计划,这时须要我们尽量用 ...

  3. Assignment HDU - 2853(二分图匹配 KM 新边旧边)

    传送门: Assignment HDU - 2853 题意:题意直接那松神的题意了.给了你n个公司和m个任务,然后给你了每个公司处理每个任务的效率.然后他已经给你了每个公司的分配方案,让你求出最多能增 ...

  4. HDU 2853 最大匹配&KM模板

    http://acm.hdu.edu.cn/showproblem.php?pid=2853 这道题初看了没有思路,一直想的用网络流如何解决 参考了潘大神牌题解才懂的 最大匹配问题KM 还需要一些技巧 ...

  5. HDU 2853 (KM最大匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2853 题目大意:二分图匹配费用流.①最大匹配②最小原配变动 解题思路: 如果去掉第二个要求,那么就是裸 ...

  6. 【HDU 2853】 KM算法

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2853 题意:有n个公司,m个任务,每个公司做每个任务都有一个效率值,最开始每个公司都指派了一个任务,现 ...

  7. hdu 2853 Assignment KM算法

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2853 Last year a terrible earthquake attacked Sichuan ...

  8. HDU 2853 && HDU 3315

    http://acm.hdu.edu.cn/showproblem.php?pid=2853 题意:给一个n-m二分图,边权用一个n*m的矩阵表示,给出初始匹配,求二分图完美匹配相比初始匹配改变了几条 ...

  9. Assignment (HDU 2853 最大权匹配KM)

    Assignment Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  10. HDU 2853 & 剩余系+KM模板

    题意: 给你一张二分图,给一个原匹配,求原匹配改动最少的边数使其边权和最大. SOL: 我觉得我的智商还是去搞搞文化课吧..这种题给我独立做我大概只能在暴力优化上下功夫.. 这题的处理方法让我想到了剩 ...

随机推荐

  1. [ES6] for..in && for..of

    var ary = [ { id: 1, name: "Zhentian" }, { id: 2, name: "Alice" } ]; for..in Pri ...

  2. [ES6] Array -- Destructuring and Rest Parameters && for ..of && Arrat.find()

    We can use the destructing and rest parameters at the same time when dealing with Array opration. Ex ...

  3. 《STL源代码剖析》---stl_alloc.h阅读笔记

    这一节是讲空间的配置与释放,但不涉及对象的构造和析构,仅仅是解说对象构造前空前的申请以及对象析构后空间怎么释放. SGI版本号的STL对空间的的申请和释放做了例如以下考虑: 1.向堆申请空间 2.考虑 ...

  4. 用C/C++扩展你的PHP(转)

    简 介 英文版下载: PHP 5 Power Programming PHP取得成功的一个主要原因之一是她拥有大量的可用扩展.web开发者无论有何种需求,这种需求最有可能在PHP发行包里找到.PHP发 ...

  5. Oracle11g新特性之动态变量窥视

    1. 11g之前的绑定变量窥视     我们都知道,为了可以让SQL语句共享运行计划,oracle始终都是强调在进行应用系统的设计时,必须使用绑定变量,也就是用一个变量来取代原来出如今SQL语句里的字 ...

  6. Java基础知识强化59:String(字符串)和其他类型的相互转化

    1. String类型 ---> 其他类型 (1)使用基本类型包装类的parseXXX方法 e.g:String(字符串)转化为int(整型) String MyNumber ="12 ...

  7. linux命令帮助

    Linux命令格式:command [options] [arguments]command:命令options: 参数 [] 表示是可选的;<> 表示是可变化的; x|y|z 表示只能选 ...

  8. ComboTree( 树型下拉框) 组件

    本节课重点了解EasyUI中Tree(树)组件的使用方法, 这个组件依赖于Combo(下拉框)和 Tree(树)组件.一. 加载方式//class 加载方式<select id="cc ...

  9. C# 并行编程 之 并发集合 (.Net Framework 4.0)(转)

    转载地址:http://blog.csdn.net/wangzhiyu1980/article/details/45497907 此文为个人学习<C#并行编程高级教程>的笔记,总结并调试了 ...

  10. x++ and ++x

    http://blog.sina.com.cn/s/blog_6c762bb30101ar1w.html 看到个东西,搞不清的时候可以看看 =.=