【最大费用流】【最优匹配】丘比特的烦恼 Vijos 1169
描述
随着社会的不断发展,人与人之间的感情越来越功利化。最近,爱神丘比特发现,爱情也已不再是完全纯洁的了。这使得丘比特很是苦恼,他越来越难找到合适的男女,并向他们射去丘比特之箭。于是丘比特千里迢迢远赴中国,找到了掌管东方人爱情的神——月下老人,向他求教。
月下老人告诉丘比特,纯洁的爱情并不是不存在,而是他没有找到。在东方,人们讲究的是缘分。月下老人只要做一男一女两个泥人,在他们之间连上一条红线,那么它们所代表的人就会相爱——无论他们身处何地。而丘比特的爱情之箭只能射中两个距离相当近的人,选择的范围自然就小了很多,不能找到真正的有缘人。
丘比特听了月下老人的解释,茅塞顿开,回去之后用了人间的最新科技改造了自己的弓箭,使得丘比特之箭的射程大大增加。这样,射中有缘人的机会也增加了不少。
情人节(Valentine's day)的午夜零时,丘比特开始了自己的工作。他选择了一组数目相等的男女,感应到他们互相之间的缘分大小,并依此射出了神箭,使他们产生爱意。他希望能选择最好的方法,使被他选择的每一个人被射中一次,且每一对被射中的人之间的缘分的和最大。
当然,无论丘比特怎么改造自己的弓箭,总还是存在缺陷的。首先,弓箭的射程尽管增大了,但毕竟还是有限的,不能像月下老人那样,做到“千里姻缘一线牵”。其次,无论怎么改造,箭的轨迹终归只能是一条直线,也就是说,如果两个人之间的连线段上有别人,那么莫不可向他们射出丘比特之箭,否则,按月下老人的话,就是“乱点鸳鸯谱”了。
作为一个凡人,你的任务是运用先进的计算机为丘比特找到最佳的方案。
格式
输入格式
输入第一行为正整数k,表示丘比特之箭的射程,第二行为正整数n(n<30),随后有2n行,表示丘比特选中的人的信息,其中前n行为男子,后n行为女子。每个人的信息由两部分组成:他的姓名和他的位置。姓名是长度小于20且仅包含字母的字符串,忽略大小写的区别,位置是由一对整数表示的坐标,它们之间用空格分隔。格式为x y Name。输入文件剩下的部分描述了这些人的缘分。每一行的格式为Name1 Name2 p。Name1和Name2为有缘人的姓名,p是他们之间的缘分值(p为小于等于255的正整数)。以一个End作为文件结束标志。每两个人之间的缘分至多只被描述一次。如果没有被描述,则说明他们缘分值为1。
输出格式
输出仅一个正整数,表示每一对被射中的人之间的缘分的总和。这个和应当是最大的。
样例1
样例输入1
2 3 0 0 Adam 1 1 Jack 0 2 George 1 0 Victoria 0 1 Susan 1 2 Cathy Adam Cathy 100 Susan George 20 George Cathy 40 Jack Susan 5 Cathy Jack 30 Victoria Jack 20 Adam Victoria 15 End
样例输出1
65
不想吐槽了。。。。。
首先是题目描述,样例明明是先读入坐标(x,y)在读入名字,但是题目描述是先名字后坐标。。。。纠结了好久。。。。
抱着试一试的心态才知道是先坐标后名字
题目说的没有重边,但是数据有!
得知数据有重边后我又判断,取最优的那条边,但是数据是取的最后出现的那条边!
还有,几何不好的孩子太苦逼了。。。。。。
下面是我们需要注意的几点
1.弓箭的射程有限。
2.箭的轨迹只能是一条直线,两个人之间的连线段不能有别人。
3.忽略大小写的区别。
4.如果没有被描述,则说明他们缘分值为1,但并不一定有边!(即在射程内)
6.重边取最后一条
关键是第二点。判了好久啊。。。。。。。。。。。。。。。。。。。。。
做了一上午,都在判第二点。。。。。。
测评情况(Vijos):
C++ AC Code
/*http://blog.csdn.net/jiangzh7
By Jiangzh*/
#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
const int N=1000;
const int inf=0x3f3f3f3f;
#define sqr(_) ((_)*(_))
typedef long long LL;
int K,n;
struct node{char name[50];int x,y;}p[N];
int cap[N][N],cost[N][N];
int S,T;
int dist[N],h[N],pre[N];
queue<int> q;void predoing(char *s)//全部转化为小写
{int len=strlen(s);for(int i=0;i<len;i++) s[i]=tolower(s[i]);
}void read()
{scanf("%d%d\n",&K,&n);for(int i=1;i<=n*2;i++){scanf("%d%d%s\n",&p[i].x,&p[i].y,p[i].name);predoing(p[i].name);}
}int find(char *s)//找到对应名字的序号
{for(int i=1;i<=n*2;i++)if(!strcmp(s,p[i].name)) return i;
}double dis(int x1,int y1,int x2,int y2)//距离
{return sqrt((double)sqr((LL)x1-x2)+(double)sqr((LL)y1-y2));
}bool check(int i,int j)//检查能否连边
{int x1=p[i].x,y1=p[i].y;int x2=p[j].x,y2=p[j].y;if(dis(x1,y1,x2,y2)>(double)K) return false;for(int i=1;i<=n+n;i++){if(p[i].x==x1&&p[i].y==y1) continue;if(p[i].x==x2&&p[i].y==y2) continue;int x0=p[i].x,y0=p[i].y;if((x0-x1)*(x0-x2)<=0 && (y0-y1)*(y0-y2)<=0)if((x0-x1)*(y2-y1)==(y0-y1)*(x2-x1))//p在boy和girl连线上return false;}return true;
}void build_map()//建图
{char b[50],g[50];for(int i=1;i<=n;i++)for(int j=n+1;j<=n+n;j++)if(dis(p[i].x,p[i].y,p[j].x,p[j].y)<=K)//必须在射程内{cap[i][j]=1;cost[i][j]=1;cost[j][i]=-1;}int x,y,w;while(1){memset(b,0,sizeof(b));memset(g,0,sizeof(g));scanf("%s",b);if(!strcmp(b,"End")) break;scanf("%s%d\n",g,&w);predoing(b);predoing(g);x=find(b);y=find(g);if(x>y) swap(x,y);//不一定是男在前,所以必要的时候交换一下位置if(check(x,y)){cost[x][y]=w;cost[y][x]=-w;}}S=0;T=n+n+1;//源点和汇点for(int i=1;i<=n;i++) {cap[S][i]=1;cost[S][i]=0;}for(int i=n+1;i<=n+n;i++) {cap[i][T]=1;cost[i][T]=0;}
}bool spfa()
{for(int i=S;i<=T;i++) dist[i]=-inf;dist[S]=0;q.push(S);while(!q.empty()){int x=q.front();q.pop();h[x]=false;for(int i=S;i<=T;i++)if(cap[x][i]>0 && dist[i]<dist[x]+cost[x][i]){pre[i]=x;dist[i]=dist[x]+cost[x][i];if(!h[i]){h[i]=true;q.push(i);}}}return dist[T]!=-inf;
}void work()
{build_map();int maxcost=0;while(spfa()){int res=inf;for(int i=T;i!=S;i=pre[i]){res=min(res,cap[pre[i]][i]);}for(int i=T;i!=S;i=pre[i]){cap[pre[i]][i]-=res;cap[i][pre[i]]+=res;}maxcost+=res*dist[T];}printf("%d\n",maxcost);
}int main()
{freopen("cupid.in","r",stdin);freopen("cupid.out","w",stdout);read();work();return 0;
}
【最大费用流】【最优匹配】丘比特的烦恼 Vijos 1169相关推荐
- 316C Tidying Up 费用流的完美匹配
题目链接: http://codeforces.com/gym/257279/problem/C 题意: 你有一个 n∗mn*mn∗m 的矩阵,这些方格中有数字 1−n∗m/21-n*m/21−n∗m ...
- 【POJ - 2195】Going Home(二分图最优匹配,费用流 或 KM)
题干: On a grid map there are n little men and n houses. In each unit time, every little man can move ...
- 【SPOJ - SCITIES】Selfish Cities (二分图最优匹配,最大费用流)
题干: Far, far away there is a world known as Selfishland because of the nature of its inhabitants. Ha ...
- hdu 3395(费用流,二分图的最大权匹配)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3395 解题思路: 这个构图很容易出错,最开始都容易想,把每个点拆开,分为攻击和被攻击的,建图如下: 源 ...
- UVA1411 Ants(带权二分图的最大完美匹配、zkw费用流)
题解 给定一些黑点白点,要求一个黑点链接一个白点并且线段不相交(转成二分图最大权匹配使用费用流解决)<训练指南>P351 输出方案:满流即为答案(满流是指这条路的流量跑满了,也就是说edg ...
- [NOI2012]美食节——费用流(带权二分图匹配)+动态加边
题目描述 小M发现,美食节共有n种不同的菜品.每次点餐,每个同学可以选择其中的一个菜品.总共有m个厨师来制作这些菜品.当所有的同学点餐结束后,菜品的制作任务就会分配给每个厨师.然后每个厨师就会同时开始 ...
- upc 6445: 棋盘V (网络流费用流解决匹配问题)
6445: 棋盘V 时间限制: 1 Sec 内存限制: 128 MB 提交: 325 解决: 31 [提交] [状态] [讨论版] [命题人:admin] 题目描述 有一块棋盘,棋盘的边长为100 ...
- 【BZOJ2539】【codevs1221】丘比特的烦恼,trie树+几何判断+费用流
传送门1 传送门2 写在前面:写90分不如写10分难 思路:很简单的思路!trie把字符串变成数字编号,邻接矩阵记录点之间的边权,判断是否在射程内或线段上是否有人不用什么斜率!用两点距离!然后直接上费 ...
- BZOJ1150[CTSC2007]数据备份Backup——模拟费用流+堆+链表
题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游 ...
最新文章
- 效率提升多倍, 推荐值得收藏40 个命令总结
- [原创]java WEB学习笔记02:javaWeb开发的目录结构
- 奶块哪种服务器人最多,奶块什么服务器人多 | 手游网游页游攻略大全
- python实现文件上传预览_前端实现文件预览功能
- 基于jquery的上传插件Uploadify 3.1.1在MVC3中的使用
- linux重启was控制台报错,IHS启动时报错,从was控制台传播插件失败
- lora信号测试小助手_LoRa是如何通过CAD来实现唤醒的
- c++调用cplex求解例子_c++调用CPLEX环境配置
- java利用栈求复杂表达式_java中的栈Stack的基本使用和应用(二) ——利用栈计算合法的算术表达,中缀表达式转后缀表达式...
- Centos下磁盘管理的常用命令记录(如查找大文件)
- matlab动态显示鼠标值,动态显示鼠标的坐标值和像素值
- 实现手机访问网站时点击手机号码直接拨打电话的功能
- 没解决:MMC不能打开文件MSC可能是由于文件不存在,不是一个MMC控制台,或者用后来的MMC版本创建。也可能你没有访问此文件的足够权限
- HTML全面深入学习-用label获得焦点
- 51单片机的家居空气质量监测系统proteus仿真设计
- Python绘制一箭穿双心 动画代码
- WebDay05 JQuery框架
- filter 过滤器
- win高分屏下Qt程序的界面适配处理
- 树莓派:10行代码体验红外检测
热门文章
- [kafka]kafka中的zookeeper是做什么的?
- 心理测评软件php mysql_心理测评系统
- 自学前端第十八天:CSS精准定位position
- error: undefined reference to ‘typeinfo for android::RefBase‘ hidl_death_recipient
- mybatis collection 子查询,嵌套查询,解决分页问题
- 《大长今》分集剧情介绍(下)
- kankan转载:anddroid卡牌效果实现
- linux系统日志怎么退出,linux系统日志的清除
- 统计图表导入word,用到echarts,highcharts,amcharts,jfreechart
- 【笔记】——MySQL数据库——基础知识-——快速回顾——(加深印象篇)