[题目链接]

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. C#——接口的意义以及与抽象类的区别

    接口的意义是什么呢?接口与抽象类又有什么区别?什么情况选择用接口?什么情况选择用抽象类? 接口的意义: 1.实际开发中的约束作用,继承接口的类必须实现接口规定的方法,方便多人开发中的协同,避免随意性. ...

  2. MyBatis入门3_mapper.xml优化(parameterType简写_NameSpace简写_sql片段_特殊字符处理)_动态SQL

    本文为博主辛苦总结,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 谢谢配合! 优化 1.起别名(一般不用,写全方便查看类出处) 以前 ...

  3. Android本地消息推送

    项目介绍:cocos2dx跨平台游戏 项目需求:实现本地消息推送,需求①:定点推送:需求②:根据游戏内逻辑实现推送(比如玩家体力满时,需要计算后到点推送):需求③:清理后台程序或重启后依然能够实现本地 ...

  4. eclipse中代码整体左右移动的方法

    1.向左:将要移动的代码选中,然后按TAB键2.向右:将要移动的代码选中,然后按shift+tab键 kettas:  2009-8-21

  5. Sandbox 沙盒

    In computer security, a sandbox is a security mechanism for separating running programs, usually in ...

  6. python学习笔记--关于函数的那点事1

    函数参数 1.位置参数 类似于java函数的基本参数,按照顺序和结构定义参数 2.默认参数 def method(param,defaultParam=defaultValue) 调用时,可以调用me ...

  7. swift-UINavigationController纯代码自定义导航控制器及底部工具栏的使用

    step1:自定义一个类  NTViewController,该类继承UITabBarController: // // NTViewController.swift // Housekeeper / ...

  8. webpack打包出错,通过babel将es6转es5的出错。

    错误信息如下: 解决方法: 1,先安装babel-preset-es2015到项目中, cnpm install babel-preset-es2015 --save-dev2,在项目根目录中新建一个 ...

  9. 一个电商项目的Web服务化改造7:Dubbo服务的调用,4个项目

    使用dubbo服务的过程,很简单,和之前学习的WebService完全一样,和本地接口调用也基本一致. dubbo和WebService的区别:我认为dubbo就是封装了WebService,然后提供 ...

  10. 【DIP Learining MFC &OpenCV】 Experience by 20171026

    This day saw the progress I achieved in creating a fusion of MFC frame and OpenCV code as well as so ...