UVa:1411 Ants(KM算法)
来源:互联网 发布:苹果6在线软件 编辑:程序博客网 时间:2024/06/09 18:11
由黑白两色的结点很容易想到二分图匹配,但是线段相交这里很难处理。这里有一个性质,即不相交的线段和一定小于相交的线段和。由于一定存在解,那么这样线段和最小的情况一定是不相交的。这样由KM算法求最小权即可。
一开始以为用距离不开方用longlong可以存下,结果一直WA,改成double才过掉。注意两个样例之间有空行。
#include <iostream>#include <cstdio>#include <cstring>#include <string>#include <cmath>#include <vector>#include <queue>#include <map>#include <algorithm>#define ll long long#define INF 1e30#define inf -2139062144#define MOD 20071027#define MAXN 105using namespace std;bool visx[MAXN],visy[MAXN];double lx[MAXN],ly[MAXN],slack[MAXN];double w[MAXN][MAXN];int link[MAXN];int nx,ny,n;bool find(int x){ visx[x]=true; for(int y=1; y<=ny; ++y) if(!visy[y]) { if(fabs(lx[x]+ly[y]-w[x][y])<1e-6) { visy[y]=true; if(link[y]==-1||find(link[y])) { link[y]=x; return true; } } else slack[y]=min(slack[y],lx[x]+ly[y]-w[x][y]); } return false;}void KM(){ memset(link,-1,sizeof(link)); memset(lx,0x80,sizeof(lx)); memset(ly,0,sizeof(ly)); for(int i=1; i<=nx; ++i) for(int j=1; j<=ny; ++j) lx[i]=max(lx[i],w[i][j]); for(int x=1; x<=nx; ++x) { memset(slack,0x7f,sizeof(slack)); while(1) { memset(visx,0,sizeof(visx)); memset(visy,0,sizeof(visy)); if(find(x)) break; double d=INF; for(int y=1; y<=ny; ++y) if(!visy[y]&&d>slack[y]) d=slack[y]; for(int i=1; i<=nx; ++i) if(visx[i]) lx[i]-=d; for(int i=1; i<=ny; ++i) if(visy[i]) ly[i]+=d; else slack[i]-=d; } }}double dist(int x1,int y1,int x2,int y2){ return sqrt((double)(x1-x2)*(x1-x2)+(double)(y1-y2)*(y1-y2));}int xx1[MAXN],yy1[MAXN];int xx2[MAXN],yy2[MAXN];int main(){ int kase=0; while(scanf("%d",&n)!=EOF) { nx=n; ny=n; if(kase) printf("\n"); for(int i=1; i<=n; ++i) scanf("%d%d",&xx1[i],&yy1[i]); for(int i=1; i<=n; ++i) scanf("%d%d",&xx2[i],&yy2[i]); for(int i=1; i<=n; ++i) for(int j=1; j<=n; ++j) w[j][i]=-dist(xx1[i],yy1[i],xx2[j],yy2[j]); KM(); for(int i=1; i<=n; ++i) printf("%d\n",link[i]); kase=1; } return 0;}
0 0
- UVa:1411 Ants(KM算法)
- UVa 1411 Ants(KM)
- Uva 1411 ants(KM算法--二分图最佳完美匹配)
- uva 1411 Ants (权值和最小的完美匹配---KM算法)
- Ants - POJ 3565 KM算法
- poj 3565 Ants KM算法
- POJ 3565 Ants (证明+KM算法)
- poj 3565 Ants (KM算法)
- Uva live 4043 Ants( KM+简单的计算几何)
- POJ 3565 Ants (最小权完美匹配 KM算法)
- UVALive4043[Ants] 二分图完美匹配 KM算法
- UVA-11383 (KM算法)
- POJ_3565 Ants KM匹配
- poj 3565 Ants KM
- poj3565 ants(KM)
- 【KM】POJ3565[Ants]题解
- poj3565 Ants(KM)
- UVa:11383 Golden Tiger Claw(KM算法)
- 数据库索引
- linux---ext3grep---防止误删的工具
- 5个国内优秀网站
- HDU1754 I Hate It(线段树)
- spring +struts2 + ibatis + mysql 案例配置
- UVa:1411 Ants(KM算法)
- AttributeError: 'module' object has no attribute 'Frame' 解决方法
- Mymind教学系列--Github上的免费且强大思维导图工具-(一)
- linux常用查看硬件设备信息命令
- Spring【IOC】【AOP】
- struts2-校验框架
- Tomcat:IOException while loading persisted sessions: java
- bower install js使用bower管理js
- 欧拉计划 Java实现