#KM算法#UVA11383 Golden Tiger Claw
2022/3/2 22:15:27
本文主要是介绍#KM算法#UVA11383 Golden Tiger Claw,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
题目
给定 \(n*n\) 的矩阵,现在给每行安排一个权值 \(x_i\),给每列安排一个权值 \(y_j\),
使得 \(x_i+y_j\geq a_{i,j}\),并且使 \(\sum_{i=1}^nx_i+y_i\) 最小。
分析
学过KM算法的话,就应该知道可以将 \(x_i\) 和 \(y_i\) 当成顶标,并且当 \(x_i+y_j=a_{i,j}\) 时取得最小值,
那么就转换成二分图最大权匹配,直接跑KM算法将匹配的边权和加起来就是答案。
代码
#include <cstdio> #include <cctype> #include <cmath> #include <queue> using namespace std; const int N=511; bool vx[N],vy[N]; queue<int>q; int slack[N],lx[N],ly[N],G[N][N]; int px[N],py[N],link[N],n,ans; int iut(){ int ans=0,f=1; char c=getchar(); while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar(); while (isdigit(c)) ans=ans*10+c-48,c=getchar(); return ans*f; } void print(int ans){ if (ans>9) print(ans/10); putchar(ans%10+48); } int min(int a,int b){return a<b?a:b;} int max(int a,int b){return a>b?a:b;} void adjust(int y){ for (int _y;y;y=_y){ _y=px[link[y]]; px[link[y]]=y; py[y]=link[y]; } } void bfs(int st){ for (int i=1;i<=n;++i) slack[i]=0x3f3f3f3f,vx[i]=vy[i]=0; while (!q.empty()) q.pop(); q.push(st); while (1){ while (!q.empty()){ int x=q.front(); vx[x]=1,q.pop(); for (int y=1;y<=n;++y) if (!vy[y]&&slack[y]>lx[x]+ly[y]-G[x][y]){ slack[y]=lx[x]+ly[y]-G[x][y],link[y]=x; if (!slack[y]){ vy[y]=1; if (!py[y]) {adjust(y); return;} else q.push(py[y]); } } } int mn=0x3f3f3f3f; for (int i=1;i<=n;++i) if (!vy[i]) mn=min(mn,slack[i]); for (int i=1;i<=n;++i){ if (vx[i]) lx[i]-=mn; if (vy[i]) ly[i]+=mn; else slack[i]-=mn; } for (int i=1;i<=n;++i) if (!vy[i]&&!slack[i]){ vy[i]=1; if (!py[i]) {adjust(i); return;} else q.push(py[i]); } } } void KM(){ for (int i=1;i<=n;++i){ link[i]=ly[i]=px[i]=py[i]=0,lx[i]=-0x3f3f3f3f; for (int j=1;j<=n;++j) lx[i]=max(lx[i],G[i][j]); } for (int i=1;i<=n;++i) bfs(i); } int main(){ while (scanf("%d",&n)==1){ for (int i=1;i<=n;++i) for (int j=1;j<=n;++j) G[i][j]=iut(); KM(),ans=0; for (int i=1;i<=n;++i) ans+=lx[i],ans+=ly[i]; for (int i=1;i<=n;++i) print(lx[i]),putchar(i==n?10:32); for (int i=1;i<=n;++i) print(ly[i]),putchar(i==n?10:32); print(ans),putchar(10); } return 0; }
这篇关于#KM算法#UVA11383 Golden Tiger Claw的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-15SendGrid 的 Go 客户端库怎么实现同时向多个邮箱发送邮件?-icode9专业技术文章分享
- 2024-11-15SendGrid 的 Go 客户端库怎么设置header 和 标签tag 呢?-icode9专业技术文章分享
- 2024-11-12Cargo deny安装指路
- 2024-11-02MongoDB项目实战:从入门到初级应用
- 2024-11-01随时随地一键转录,Google Cloud 新模型 Chirp 2 让语音识别更上一层楼
- 2024-10-25Google Cloud动手实验详解:如何在Cloud Run上开发无服务器应用
- 2024-10-24AI ?先驱齐聚 BAAI 2024,发布大规模语言、多模态、具身、生物计算以及 FlagOpen 2.0 等 AI 模型创新成果。
- 2024-10-20goland工具下,如修改一个项目的标准库SDK的版本-icode9专业技术文章分享
- 2024-10-17Go学习:初学者的简单教程
- 2024-10-17Go学习:新手入门完全指南