[题目链接]

http://poj.org/problem?id=3565

[算法]

KM算法求最小匹配

[代码]

#include <algorithm>
#include <bitset>
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <limits>
#include <list>
#include <map>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <utility>
#include <vector>
#include <cwchar>
#include <cwctype>
#include <stack>
#include <limits.h>
using namespace std;
#define MAXN 110
const double INF = 1e12;
const double eps = 1e-; int i,j,n;
pair<double,double> a[MAXN],b[MAXN];
double w[MAXN][MAXN];
double la[MAXN],lb[MAXN];
double delta;
int ans[MAXN],match[MAXN];
bool visiteda[MAXN],visitedb[MAXN]; inline double dist(pair<double,double> a,pair<double,double> b)
{
return 1.0 * sqrt((a.first - b.first) * (a.first - b.first) + (a.second - b.second) * (a.second - b.second));
}
inline bool dfs(int u)
{
int v;
visiteda[u] = true;
for (v = ; v <= n; v++)
{
if (!visitedb[v])
{
if (fabs(la[u] + lb[v] - w[u][v]) < eps)
{
visitedb[v] = true;
if (!match[v] || dfs(match[v]))
{
match[v] = u;
return true;
}
}
}
}
return false;
}
inline void KM()
{
int i,j,k;
memset(match,,sizeof(match));
for (i = ; i <= n; i++)
{
la[i] = -INF;
lb[i] = ;
for (j = ; j <= n; j++) la[i] = max(la[i],w[i][j]);
}
for (i = ; i <= n; i++)
{
while (true)
{
delta = INF;
for (j = ; j <= n; j++) visiteda[j] = visitedb[j] = false;
if (dfs(i)) break;
for (j = ; j <= n; j++)
{
if (visiteda[j])
{
for (k = ; k <= n; k++)
{
if (!visitedb[k])
delta = min(delta,la[j] + lb[k] - w[j][k]);
}
}
}
for (j = ; j <= n; j++)
{
if (visiteda[j]) la[j] -= delta;
if (visitedb[j]) lb[j] += delta;
}
}
}
} int main()
{ scanf("%d",&n);
for (i = ; i <= n; i++) scanf("%lf%lf",&a[i].first,&a[i].second);
for (i = ; i <= n; i++) scanf("%lf%lf",&b[i].first,&b[i].second);
for (i = ; i <= n; i++)
{
for (j = ; j <= n; j++)
{
w[i][j] = -dist(a[i],b[j]);
}
}
KM();
for (i = ; i <= n; i++) ans[match[i]] = i;
for (i = ; i <= n; i++) printf("%d\n",ans[i]); return ; }

[POJ 3565] Ant的更多相关文章

  1. poj 3565 ants

    /* poj 3565 递归分治 还有用KM的做法 这里写的分治 按紫书上的方法 不过那里说的有点冗杂了 可以简化一下 首先为啥可以分治 也就是分成子问题解决 只要有一个集合 黑白的个数相等 就一定能 ...

  2. POJ 3565 Ants 【最小权值匹配应用】

    传送门:http://poj.org/problem?id=3565 Ants Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: ...

  3. poj 3565 二分图最优匹配

    思路: 将ant与tree之间用距离来做权值,求最小权匹配就可以了.可以想到,如果有两条线段相交,那么将这两个线段交换一个顶点,使其不相交,其权值和一定会更小. 就像斜边永远比直角边长一样的道理. # ...

  4. poj 3046 Ant Counting

    Ant Counting Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4982   Accepted: 1896 Desc ...

  5. poj 3046 Ant Counting (DP多重背包变形)

    题目:http://poj.org/problem?id=3046 思路: dp [i] [j] :=前i种 构成个数为j的方法数. #include <cstdio> #include ...

  6. poj 3046 Ant Counting(多重集组合数)

    Ant Counting Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Total ...

  7. poj 3046 Ant Counting——多重集合的背包

    题目:http://poj.org/problem?id=3046 多重集合的背包问题. 1.式子:考虑dp[ i ][ j ]能从dp[ i-1 ][ k ](max(0 , j - c[ i ] ...

  8. POJ 3565 Ants(最佳完美匹配)

    Description Young naturalist Bill studies ants in school. His ants feed on plant-louses that live on ...

  9. POJ 3046 Ant Counting ( 多重集组合数 && 经典DP )

    题意 : 有 n 种蚂蚁,第 i 种蚂蚁有ai个,一共有 A 个蚂蚁.不同类别的蚂蚁可以相互区分,但同种类别的蚂蚁不能相互区别.从这些蚂蚁中分别取出S,S+1...B个,一共有多少种取法. 分析 :  ...

随机推荐

  1. VC窗口类的销毁-是否需要delete

    Windows窗口如果使用new的方法添加之后,在父窗口析构的时候,有些需要delete有些却不需要delete.这个的确有点坑,由于c++的实现,对于每个自己new的对象,我都会delete删除它, ...

  2. ajax 实现输入提示效果

    网站主页 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  3. 02--SQLite操作一步到位

    SQLite数据库(一):基本操作 SQLite 是一个开源的嵌入式关系数据库,实现自包容.零配置.支持事务的SQL数据库引擎. 其特点是高度便携.使用方便.结构紧凑.高效.可靠. 与其他数据库管理系 ...

  4. html5——表单

    type类型 email //输入email格式 tel //手机号码 url //只能输入url格式 number //只能输入数字 search //搜索框 range //范围 滑动条 colo ...

  5. [Windows Server 2008] 查看ASP.net详细错误信息

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:查看IIS ...

  6. utf-8与unicode是什么关系

    简单来说: Unicode  is a charset. ------Unicode 他就是一个字符集 UTF-8 is encoding style. --------UTF-8他就是一种编码方式, ...

  7. LVS部分调度算法的适应场景分析

    1.轮叫调度算法(RR)假设所有服务器处理性能均相同,不管服务器的当前连接数和响应速度.该算法相对简单,不适用于服务器组中处理性能不一的情况,而且当请求服务时间变化比较大时,轮叫调度算法容易导致服务器 ...

  8. CAD从二制流数据中加载图形(com接口)

    主要用到函数说明: _DMxDrawX::ReadBinStream 从二制流数据中加载图形,详细说明如下: 参数 说明 VARIANT varBinArray 二制流数据,是个byte数组 BSTR ...

  9. todey

    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/> 框架集fromset ...

  10. 零基础学习Python培训,应该选择哪个培训班?

    近几年中,Python一直是市场上最受欢迎的编程语言之一.它语法自然,入门简单,同时应用范围又极广,无论是大火的人工智能.大数据还是传统的web开发.自动化运维,Python都能够大展拳脚.根据职友集 ...