题意

给出n个白点和n个黑点的坐标,要求用n条不相交的线段把他们连接起来,其中每条线段恰好连接一个白点和一个黑点,每个点恰好连接一条线段。

分析

结点分黑白,很容易想到二分图。其中每个白点对应一个X结点,每个黑点对应一个Y点,每个黑点和每个白点相连,权值等于二者的欧几里得距离,建模之后,最佳完美匹配就是问题的解。

为什么用费用流而不用KM呢,因为我不会···

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
#include <cmath> using namespace std;
const int maxN=;
const int maxm=+;
const int INF=;
int n;
int ax[maxN],bx[maxN],ay[maxN],by[maxN]; struct MCMF{
int head[maxN],to[maxm],Next[maxm],from[maxm],flow[maxm],cap[maxm];
double cost[maxm];
int n,m,s,t,sz;
int inq[maxN];
double d[maxN];
int p[maxN];
int a[maxN]; void init(int n){
this->n=n;
sz=-;
memset(head,-,sizeof(head));
}
void AddEdge(int a,int b,int ca,double co){
++sz;
to[sz]=b,from[sz]=a,Next[sz]=head[a],head[a]=sz;
flow[sz]=,cap[sz]=ca,cost[sz]=co;
++sz;
to[sz]=a,from[sz]=b,Next[sz]=head[b],head[b]=sz;
flow[sz]=ca,cap[sz]=ca,cost[sz]=-co;
}
bool BellmanFord(int s,int t,int &Flow,double &Cost){
for(int i=;i<=n;i++)d[i]=INF;
memset(inq,,sizeof(inq));
d[s]=;inq[s]=;p[s]=-;a[s]=INF;
queue<int>Q;
Q.push(s);
while(!Q.empty()){
int u=Q.front();Q.pop();
inq[u]=;
for(int i=head[u];i!=-;i=Next[i]){
int v=to[i];
if(cap[i]>flow[i]&&d[v]>d[u]+cost[i]){
d[v]=d[u]+cost[i];
p[v]=i;
a[v]=min(a[u],cap[i]-flow[i]);
if(!inq[v]){
Q.push(v);
inq[v]=;
}
}
}
}
if(d[t]==INF)return false;
Flow+=a[t];
Cost+=d[t]*(double)a[t];
int u=t; while(u!=s){
flow[p[u]]+=a[t];
flow[p[u]^]-=a[t];
u=from[p[u]];
}
return true;
} double Mincost(int s,int t){
int Flow=;
double Cost=;
while(BellmanFord(s,t,Flow,Cost));
return Cost;
}
}mcmf; double dist(int X,int Y){
return sqrt((double)(ax[X]-bx[Y])*(ax[X]-bx[Y])+(double)(ay[X]-by[Y])*(ay[X]-by[Y]));
}
int main(){
while(scanf("%d",&n)!=EOF){
for(int i=;i<=n;i++)
scanf("%d%d",&ax[i],&ay[i]);
for(int i=;i<=n;i++)
scanf("%d%d",&bx[i],&by[i]);
mcmf.init(*n+);
for(int i=;i<=n;i++)
mcmf.AddEdge(,i,,);
for(int i=;i<=n;i++)
mcmf.AddEdge(i+n,*n+,,);
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
mcmf.AddEdge(i,j+n,,dist(i,j));
}
}
mcmf.Mincost(,*n+);
for(int i=;i<=n;i++){
for(int j=mcmf.head[i];j!=-;j=mcmf.Next[j]){
if(j%)continue;
int v=mcmf.to[j];
if(mcmf.cap[j]==mcmf.flow[j]){
printf("%d\n",v-n);
break;
}
}
}
}
return ;
}

【LA4043 训练指南】蚂蚁 【二分图最佳完美匹配,费用流】的更多相关文章

  1. Ants(二分图最佳完美匹配)

    Ants Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 6904   Accepted: 2164   Special Ju ...

  2. UVa1349 Optimal Bus Route Design(二分图最佳完美匹配)

    UVA - 1349 Optimal Bus Route Design Time Limit: 3000MS Memory Limit: Unknown 64bit IO Format: %lld & ...

  3. UVa 11383 少林决胜(二分图最佳完美匹配)

    https://vjudge.net/problem/UVA-11383 题意: 给定一个N×N矩阵,每个格子里都有一个正整数W(i,j).你的任务是给每行确定一个整数row(i),每列也确定一个整数 ...

  4. UVA - 1045 The Great Wall Game(二分图最佳完美匹配)

    题目大意:给出棋盘上的N个点的位置.如今问将这些点排成一行或者一列.或者对角线的最小移动步数(每一个点都仅仅能上下左右移动.一次移动一个) 解题思路:暴力+二分图最佳完美匹配 #include < ...

  5. Uva1349Optimal Bus Route Design(二分图最佳完美匹配)(最小值)

    题意: 给定n个点的有向图问,问能不能找到若干个环,让所有点都在环中,且让权值最小,KM算法求最佳完美匹配,只不过是最小值,所以把边权变成负值,输出时将ans取负即可 这道题是在VJ上交的 #incl ...

  6. 【LA2238 训练指南】固定分区内存管理 【二分图最佳完美匹配,费用流】

    题意 早期的多程序操作系统常把所有的可用内存划分为一些大小固定的区域,不同的区域一般大小不同,而所有区域的大小之和为可用内存的大小.给定一些程序,操作系统需要给每个程序分配一个区域,使得他们可以同时执 ...

  7. ZOJ-3933 Team Formation (二分图最佳完美匹配)

    题目大意:n个人,分为两个阵营.现在要组成由若干支队伍,每支队伍由两个人组成并且这两个人必须来自不同的阵营.同时,每个人都有m个厌恶的对象,并且厌恶是相互的.相互厌恶的人不能组成一支队伍.问最多能组成 ...

  8. UVa 1349 - Optimal Bus Route Design(二分图最佳完美匹配)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  9. UVALive 4043 Ants 蚂蚁(二分图最佳完美匹配,KM算法)

    题意: 有n个蚂蚁n棵树,蚂蚁与树要配对,在配对成功的一对之间连一条线段,要求所有线段不能相交.按顺序输出蚂蚁所匹配的树. 思路: 这个题目真是技巧啊,不能用贪心来为每个蚂蚁选择最近的树,这样很可能是 ...

随机推荐

  1. python 中的异常处理

    refer to: http://www.runoob.com/python/python-exceptions.html http://www.pythondoc.com/pythontutoria ...

  2. Microsoft Visual Studio小技巧

    main函数调试参数: Project -> Properties -> Configuration Properties -> Debugging 在Command Argumen ...

  3. SecureCRT导入已有会话

    如果别人有完整的环境信息,我们想拿过来,怎么导入?或者别人想要我的会话配置信息,怎么导出?对SecureCRT这个工具来说很easy,根本不需要去找什么导入.导出按钮,直接文件操作. 假如我的Secu ...

  4. happynear_caffe编译时,缺少头文件caffe.pb.h的问题

    由于一些问题,需要编译caffe 的windows版本,用的是happynear的caffe版本,在caffe.pb.h遇到了问题 如何生成 caffe.pb.h 将protobuf 里的 proto ...

  5. sql分割字符串详解

    create function f_split(@c varchar(2000),@split varchar(2)) returns @t table(col varchar(20)) as beg ...

  6. NETCTOSS - 中国电信运营支持系统-网络版_V-1.0

    NETCTOSS - 中国电信运营支持系统-网络版_V-1.0 NETCTOSS: C:China T:Telecom 电信 O:Operation 运营 S:Support 支持 S:System ...

  7. java多线程(2) 线程同步

    我们对线程访问同一份资源的多个线程之间,来进行协调的这个东西,就是线程同步.   例子1:模拟了多个线程操作同一份资源,可能带来的问题: package com.cy.thread; public c ...

  8. jmeter线程组 讲解

  9. xss 攻击 sql 注入

    XSS测试 "/><script>alert(document.cookie)</script><!-- <script>alert(docu ...

  10. mysql索引之四:复合索引之最左前缀原理,索引选择性,索引优化策略之前缀索引

    高效使用索引的首要条件是知道什么样的查询会使用到索引,这个问题和B+Tree中的“最左前缀原理”有关,下面通过例子说明最左前缀原理. 一.最左前缀索引 这里先说一下联合索引的概念.MySQL中的索引可 ...