Ants UVA - 1411(km板题竟然让我换了个板子)
题意:
给出n个白点和n个黑点的坐标,要求用n条不相交的线段把它们连接起来,其中每条线段恰好连接一个白点和一个黑点,每个点恰好连接到一条线段
解析:
带入负的欧几里得距离求就好了
假设a1-b1 与 a2-b2相交 则dis(a1, b1) + dis(a2, b2) 一定大于 dis(a1, b2) + dis(a2, b1)
四边形的对角线一定大于两条对边。。。
所以。。边的权值取负的欧几里得距离。。来一次km就好了 km是求最大 而负的最大 对应整的最小 而整的最小 又能对应不相交
#include <iostream>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <cmath>
#include <algorithm>
#include <vector>
#define mem(a, b) memset(a, b, sizeof(a))
using namespace std;
const int maxn = , INF = 0x7fffffff;
const double eps = 1e-;
int usedx[maxn], usedy[maxn], cx[maxn], cy[maxn];
int nx, ny, n, max_value;
double minn;
double w[maxn][maxn], bx[maxn], by[maxn], slack[maxn];
struct node
{
double x, y;
}Node[maxn], Edge[maxn]; int dcmp(double x)
{
if(fabs(x) < eps) return ; else return x < ? - : ;
} bool dfs(int u)
{
usedx[u] = ;
for(int i=; i<=ny; i++)
{
if(usedy[i] == )
{
double t = bx[u] + by[i] - w[u][i];
if(dcmp(t) == )
{
usedy[i] = ;
if(cy[i] == - || dfs(cy[i]))
{
cy[i] = u;
cx[u] = i;
return true;
}
}
else
slack[i] = min(slack[i], t);
}
}
return false;
} void km()
{
mem(cx, -);
mem(cy, -);
mem(by, );
for(int i=; i<=n; i++)
{
bx[i] = -INF;
for(int j=; j<=n; j++)
bx[i] = max(bx[i], w[i][j]);
}
for(int i=; i<=n; i++)
{
for(int j=; j<=n; j++)
slack[j] = INF;
while()
{
mem(usedx, );
mem(usedy, );
if(dfs(i)) break;
double d = INF;
for(int j=; j<=n; j++)
if(!usedy[j])
d = min(d, slack[j]);
for(int j=; j<=n; j++)
if(usedx[j] != ) bx[j] -= d;
for(int j=; j<=n; j++)
if(usedy[j] != ) by[j] += d;
else slack[j] -= d;
}
}
} int main()
{
bool flag = true;
while(~scanf("%d",&n))
{
if(true) flag = false;
else printf("\n");
for(int i=; i<=n; i++)
{
scanf("%lf%lf", &Node[i].x, &Node[i].y);
}
for(int i=; i<=n; i++)
scanf("%lf%lf", &Edge[i].x, &Edge[i].y);
for(int i=; i<=n; i++)
for(int j=; j<=n; j++)
w[i][j] = -sqrt((Edge[i].x - Node[j].x)*(Edge[i].x - Node[j].x) + (Edge[i].y - Node[j].y)*(Edge[i].y - Node[j].y)); nx = ny = n;
km();
for(int i=; i<=n; i++)
printf("%d\n", cy[i]); }
return ;
}
Ants UVA - 1411(km板题竟然让我换了个板子)的更多相关文章
- 奔小康赚大钱 HDU - 2255(最大权值匹配 KM板题)
奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- uva 1411 Ants (权值和最小的完美匹配---KM算法)
uva 1411 Ants Description Young naturalist Bill studies ants in school. His ants feed on plant-louse ...
- 【UVA 1411】 Ants (KM)
Young naturalist Bill studies ants in school. His ants feed onplant-louses that live on apple trees. ...
- UVA 1411 - Ants(二分图完美匹配)
UVA 1411 - Ants 题目链接 题意:给定一些黑点白点,要求一个黑点连接一个白点,而且全部线段都不相交 思路:二分图完美匹配,权值存负的欧几里得距离,这种话,相交肯定比不相交权值小,所以做一 ...
- UVa 489 HangmanJudge --- 水题
UVa 489 题目大意:计算机给定一个单词让你猜,你猜一个字母,若单词中存在你猜测的字母,则会显示出来,否则算出错, 你最多只能出错7次(第6次错还能继续猜,第7次错就算你失败),另注意猜一个已经猜 ...
- UVa 1585 Score --- 水题
题目大意:给出一个由O和X组成的串(长度为1-80),统计得分. 每个O的分数为目前连续出现的O的个数,例如,OOXXOXXOOO的得分为1+2+0+0+1+0+0+1+2+3 解题思路:用一个变量t ...
- 【凸包板题】Gym - 101484E E. Double Fence
http://codeforces.com/gym/101484/problem/E 题解 凸包板题 #define _CRT_SECURE_NO_WARNINGS #include<cmath ...
- Oil Skimming HDU - 4185(匹配板题)
Oil Skimming Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- Luogu P3690【模板】Link Cut Tree (LCT板题)
省选前刷道LCT板题(话说之前没做这道题-) CODE #include<bits/stdc++.h> using namespace std; inline void read(int ...
随机推荐
- 通过java反射机制获取该类的所有属性类型、值
转自:http://blog.csdn.net/sd4000784/article/details/7448221 方法使用了这俩个包下的 field 和method import Java.lang ...
- Matplotlib API汉化
Pyplot API 示例汇总:https://matplotlib.org/gallery/index.html#api-examples 该matplotlib.pyplot模块包含的功能允许您快 ...
- mfs分布式系统从理论简介到实战部署
文章前面想说的话:这篇博客写出来真是有点累到了,本来昨天就基本就写好了,放在草稿里面,今天打开就没有了!!唉,就尼玛离我而去了,只有重写,然后中间虚拟机还“爆炸”重启又搞了一会,不容易呀!!希望各位博 ...
- this指向问题(箭头函数没有this)
全局环境下,指向windows console.log(this.document === document); // true 函数上下文调用 function f1(){ return this; ...
- VS2013只显示会附加到进程,无法启动调试
今天在使用VS2013的时候,打开突然发现,只显示附加到进程,无法进行调试,调试位置显示灰色,到网上各处寻求答案,本以为是个大问题,没想到只是个小问题.主要原因只是后台开太多东西了,导致VS2013运 ...
- 【Pthon入门学习】99乘法表
学习知识点: 1. string.join(seq): 以string字符串作为分隔符,将seq的所有元素拼接成一个新的字符串 s = ['%d * %d = %d' % (y, 4, 4*y) fo ...
- arcgis10.2怎么把地理坐标系转化为投影坐标系(平面,米制坐标) arcmap 10.2 从 WGS_1984 转 Beijing_1954
方法一:在Arcmap中转换:从 WGS_1984 转 Beijing_19541.加载要转换的数据,右下角为经纬度2.点击视图——数据框属性——坐标系统3.导入或选择正确的坐标系(如选:Beijin ...
- Divide by three, multiply by two(DFS+思维)
Polycarp likes to play with numbers. He takes some integer number x, writes it down on the board, an ...
- python apply()函数
python apply函数的具体的含义: apply(func [, args [, kwargs ]]) 函数用于当函数参数已经存在于一个元组或字典中时,间接地调用函数.args是一个包含将要提供 ...
- QTemporaryDir及QTemporaryFile建立临时目录及文件夹
版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:QTemporaryDir及QTemporaryFile建立临时目录及文件夹 本文地址 ...