HDU 2448 Mining Station on the sea(KM算法)
来源:互联网 发布:新浪微博推广淘宝店铺 编辑:程序博客网 时间:2024/05/16 15:43
一开始两种放个矩阵里,不知道那里错了,一直调不对,放一个矩阵就好了。
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;const int maxn=200+5;const int inf=(1<<30);int w[maxn][maxn];int lx[maxn],ly[maxn];int s[maxn],t[maxn];int slack[maxn];int match[maxn];int n,m,k,p;int G[maxn*2][maxn*2];int boat[maxn];bool find(int i){ s[i]=true; for(int j=1;j<=n;j++) { if(t[j]) continue; int tmp=lx[i]+ly[j]-w[i][j]; if(tmp==0) { t[j]=true; if(match[j]==-1||find(match[j])) { match[j]=i; return true; } } else if(slack[j]>tmp) slack[j]=tmp; } return false;}void update(){ int d=inf; for(int i=1;i<=n;i++) if(!t[i]&&d>slack[i]) d=slack[i]; for(int i=1;i<=n;i++) if(s[i]) lx[i]-=d; for(int i=1;i<=n;i++){ if(t[i]) ly[i]+=d; else slack[i]-=d; }}void KM(){ memset(match,-1,sizeof(match)); memset(ly,0,sizeof(ly)); for(int i=1;i<=n;i++) { lx[i]=-inf; for(int j=1;j<=n;j++) if(w[i][j]>lx[i]) {lx[i]=w[i][j];} } for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) slack[j]=inf; for(;;) { memset(s,0,sizeof(s)); memset(t,0,sizeof(t)); if(find(i)) break;else update(); } } }void floyd(){ for(int k=1;k<=m+n;k++) { for(int i=1;i<=m+n;i++) { for(int j=1;j<=m+n;j++) { if(G[i][k]<inf&&G[k][j]<inf) G[i][j]=min(G[i][j],G[i][k]+G[k][j]); } } }}int main(){ while(~scanf("%d%d%d%d",&n,&m,&k,&p)) { for(int i=1;i<=n+m;i++) for(int j=1;j<=n+m;j++) G[i][j]=inf; for(int i=1;i<=m;i++) G[i][i]=0; memset(w,0,sizeof(w)); for(int i=1;i<=n;i++) scanf("%d",&boat[i]); for(int i=1;i<=k;i++){ int x,y,d; scanf("%d%d%d",&x,&y,&d); G[x+n][y+n]=G[y+n][x+n]=d; } for(int i=1;i<=p;i++){ int x,y,d; scanf("%d%d%d",&x,&y,&d); G[x][y+n]=d; } floyd(); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++){ w[i][j]=-G[i][boat[j]+n]; } } KM(); int ans=0; for(int i=1;i<=n;i++) ans+=w[match[i]][i]; printf("%d\n",-ans); } return 0;}
0 0
- hdu 2448 Mining Station on the Sea //floyed+km算法
- HDU 2448 Mining Station on the sea(KM算法)
- Mining Station on the Sea (hdu 2448 SPFA+KM)
- HDU 2448 Mining Station on the Sea 最短路+KM
- HDU 2448 Mining Station on the Sea(floyd+KM)
- hdu 2448 Mining Station on the Sea km算法+最短路
- HDU 2448 Mining Station on the Sea(最小费用最大流, KM算法)
- HDU2448 Mining Station on the Sea Floyd算法+KM算法
- hdu 2448 Mining Station on the Sea
- HDU 2448 Mining Station on the Sea
- Mining Station on the Sea----dijkstra+KM
- 【KM匹配】 HDOJ 2448 Mining Station on the Sea
- hdu 2448 Mining Station on the Sea(最短路径+KM)
- hdu 2448 Mining Station on the Sea(KM匹配//费用流)
- HDU 2448 Mining Station on the Sea(KM最大匹配+floyd)
- hdu 2448 Mining Station on the Sea【最短路Floyd+KM 最佳匹配】
- 【HDU】 2448 Mining Station on the Sea 费用流
- HDU 2448 Mining Station on the Sea(Floyd+最优匹配)
- Python函数参数类型
- Java的包装类
- spring-boot上传文件MultiPartFile获取不到文件问题解决
- windows中LIB和DLL的区别与使用
- 创建类库并导入jar包步骤,避免重复寻找路径导入jar包
- HDU 2448 Mining Station on the sea(KM算法)
- Apache 403错误&SELinux解决方案
- [BZOJ1078][SCOI2008]斜堆(可并堆)
- 关于java访问权限
- java知识体系图
- c++中h文件和lib有什么区别
- 显意识和潜意识话题引发的深入思考
- C#if循环
- C++中关于[]静态数组和new分配的动态数组的区别分析