poj3656
题解:
二分图最大匹配
根据三角形不等式
直接上最大匹配即可
注意编圈取相反数
代码:
- #include<iostream>
- #include<algorithm>
- #include<cstdio>
- #include<cstring>
- #include<cmath>
- using namespace std;
- const int N=110;
- const double INF=0xffffffffffff,eps=1e-6;
- struct Node{double x,y;}Dot1[N],Dot2[N];
- double Dist(Node a,Node b)
- {
- return -sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
- }
- int n,NX,NY,link[N],visx[N],visy[N];
- double Map[N][N],lx[N],ly[N],slack[N];
- int FindPath(int u)
- {
- visx[u]=1;
- for (int i=1;i<=NY;i++)
- {
- if (visy[i])continue;
- double temp=lx[u]+ly[i]-Map[u][i];
- if (fabs(temp)<=eps)
- {
- visy[i]=1;
- if (link[i]==-1||FindPath(link[i]))
- {
- link[i]=u;
- return 1;
- }
- }
- else if (slack[i]>temp)slack[i]=temp;
- }
- return 0;
- }
- void KM()
- {
- memset(lx,0,sizeof(lx));
- memset(ly,0,sizeof(ly));
- memset(link,-1,sizeof(link));
- for (int i=1;i<=NX;i++)
- for (int j=1;j<=NY;j++)
- if (Map[i][j]>lx[i])lx[i]=Map[i][j];
- for (int i=1;i<=NX;i++)
- {
- for (int j=1;j<=NY;j++)slack[j]=INF;
- while (1)
- {
- memset(visx,0,sizeof(visx));
- memset(visy,0,sizeof(visy));
- if (FindPath(i))break;
- double d=INF;
- for (int j=1;j<=NY;j++)
- if (!visy[j]&&d>slack[j])d=slack[j];
- for (int j=1;j<=NX;j++)
- if (visx[j])lx[j]-=d;
- for (int j=1;j<=NY;j++)
- {
- if (visy[j])ly[j]+=d;
- else slack[j]-=d;
- }
- }
- }
- }
- int main()
- {
- while (~scanf("%d",&n))
- {
- memset(Map,0,sizeof(Map));
- for (int i=1;i<=n;i++)scanf("%lf%lf",&Dot1[i].x,&Dot1[i].y);
- for (int i=1;i<=n;i++)scanf("%lf%lf",&Dot2[i].x,&Dot2[i].y);
- for (int i=1;i<=n;i++)
- for (int j=1;j<=n;j++)Map[i][j]=Dist(Dot1[i],Dot2[j]);
- NX=NY=n;
- KM();
- for (int i=1;i<=N;i++)
- for (int j=1;j<=N;j++)
- if (link[j]==i)
- {
- printf("%d\n",j);
- break;
- }
- }
- return 0;
- }
poj3656的更多相关文章
随机推荐
- Docker+.Net Core 的那些事儿-3.创建容器并运行
1.根据镜像运行容器 上篇文章建立了一个镜像: 我们以此开始,执行以下命令: docker run -d -p 5000:5000 hwapp:latest 如果返回以上结果表示建立成功. 此时如果你 ...
- Hive环境安装
说明: (Hbase依赖于Hadoop,同时需要把元数据存放在mysql中),mysql自行安装 Hadoop2.0安装参考我的博客: https://www.cnblogs.com/654wangz ...
- SpringBoot入门学习(二)
第一讲我们已经讲解了入门Demo,这一讲我们主要讲解包含以下内容 项目内一些属性配置 自定义属性配置 ConfigurationProperties配置 (1)第一个工程创建的时候会自动在工程下创建a ...
- CSS Fonts(字体)
CSS Fonts(字体) 一.serif和sans-serif字体之间的区别 注意: 在计算机屏幕上,sans-serif字体被认为是比serif字体容易阅读. 二.CSS字型 在CSS中,有两种类 ...
- Hive Shell常用操作
1.Hive非交互模式常用命令: 1) hive -e:从命令行执行指定的HQL,不需要分号: % hive -e 'select * from dummy' > a.txt 2) hive – ...
- MySQL修改max_allowed_packet
因mysql从库报错Last_IO_Error: Got a packet bigger than 'max_allowed_packet' bytes mysql> show slave st ...
- linxu 安装rabbitMQ
转载自:http://blog.csdn.net/mooreliu/article/details/44645807 首先使EPEL(http://fedoraproject.org/wiki/EPE ...
- 爬虫之JSON案例
糗事百科实例: 爬取糗事百科段子,假设页面的URL是 http://www.qiushibaike.com/8hr/page/1 要求: 使用requests获取页面信息,用XPath / re 做数 ...
- Outlook.com 系列邮箱 POP3 及 IMAP 设置方法
支持 Exchange ActiveSync 的应用 有了 EAS,你可以立即获取电子邮件,以及在一个位置查看所有文件夹.日历和联系人. 如果你的电子邮件应用支持Exchange ActiveSync ...
- 24,25-request对象
var http = require('http'); var server = http.createServer(); server.listen() console.log(server.add ...