HDU 2853 Assignment([好题] 求KM最大时,要求改动最少★★)
2015-09-01 11:12
369 查看
发生了和这位牛一样的故事。。。
#include<cstdio> #include<iostream> #include<algorithm> #include<cmath> #include<set> #include<map> #include<string> #include<cstring> #include<stack> #include<queue> #include<vector> #include<cstdlib> #define lson (rt<<1),L,M #define rson (rt<<1|1),M+1,R #define M ((L+R)>>1) #define cl(a,b) memset(a,b,sizeof(a)); #define LL long long #define P pair<int,int> #define X first #define Y second #define pb push_back #define fread(zcc) freopen(zcc,"r",stdin) #define fwrite(zcc) freopen(zcc,"w",stdout) using namespace std; const int maxn=55; const int inf=1<<28; int w[maxn][maxn]; int linker[maxn],lx[maxn],ly[maxn],slack[maxn]; bool visx[maxn],visy[maxn]; int nx,ny; bool dfs(int x){ visx[x]=true; for(int i=0;i<ny;i++){ if(visy[i])continue; int tmp=lx[x]+ly[i]-w[x][i]; if(tmp==0){ visy[i]=true; if(linker[i]==-1||dfs(linker[i])){ linker[i]=x; return true; } }else if(slack[i]>tmp){ slack[i]=tmp; } } return false; } int km(){ cl(linker,-1); cl(ly,0); for(int i=0;i<nx;i++){ lx[i]=-inf; for(int j=0;j<ny;j++)if(w[i][j]>lx[i]){lx[i]=w[i][j];} } for(int x=0;x<nx;x++){ fill(slack,slack+ny+1,inf); while(true){ cl(visx,false); cl(visy,false); if(dfs(x))break; int d=inf; for(int i=0;i<ny;i++)if(!visy[i]&&slack[i]<d){ d=slack[i]; } for(int i=0;i<nx;i++)if(visx[i])lx[i]-=d; for(int i=0;i<ny;i++)if(visy[i])ly[i]+=d; else slack[i]-=d; } } int ans=0; //bool ok=false; for(int i=0;i<ny;i++)if(linker[i]!=-1){ ans+=w[linker[i]][i]; //if(w[linker[i]][i]==-inf)ok=true; } //if(ok)return 1; return ans; } int main(){ int n,m; while(~scanf("%d%d",&n,&m)){ cl(w,0); int k=n+10; for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ scanf("%d",&w[i][j]); w[i][j]*=k; } } int sum=0,x; for(int i=0;i<n;i++){ scanf("%d",&x); x--; sum+=w[i][x]; w[i][x]+=1; } nx=n;ny=m; int t=km(); printf("%d %d\n",n-t%k,t/k-sum/k); } return 0; }
相关文章推荐
- 笔试题:判断栈的push(),pop()序列是否正确
- Ubuntu 14.04 LTS 下安装配置 JDK 8
- mysql explain解析
- ubuntu ssh 免密码登陆
- DHCP工作过程详解
- java科学计数法
- SQL左连,右连,全连
- Java遍历Map的常用方法
- 自适应页面布局使得应用适应不同屏幕的尺寸变得更加容易
- Delphi中Chrome Chromium、Cef3学习笔记(四)
- c语言练习题 2-1 正整数打印
- Multi-Master Replication Manager for MySQL
- 字符串string与char*之间的相互转换
- android 更改spinner默认样式
- JAVA使用JDBC连接MySQL数据库
- 转帖-Linux下文件(夹)名乱码的解决
- Dummy output - No Sound Card Detected(转)
- Android 网络编程——SOAP
- poj 2763 Housewife Wind (LCA转RMQ+树状数组)
- 判断字符串是否UTF8, 支持最大6个字节的UTF8字符