Vijos-P1169丘比特的烦恼

Accepted

描述

随着社会的不断发展,人与人之间的感情越来越功利化。最近,爱神丘比特发现,爱情也已不再是完全纯洁的了。这使得丘比特很是苦恼,他越来越难找到合适的男女,并向他们射去丘比特之箭。于是丘比特千里迢迢远赴中国,找到了掌管东方人爱情的神——月下老人,向他求教。

月下老人告诉丘比特,纯洁的爱情并不是不存在,而是他没有找到。在东方,人们讲究的是缘分。月下老人只要做一男一女两个泥人,在他们之间连上一条红线,那么它们所代表的人就会相爱——无论他们身处何地。而丘比特的爱情之箭只能射中两个距离相当近的人,选择的范围自然就小了很多,不能找到真正的有缘人。

丘比特听了月下老人的解释,茅塞顿开,回去之后用了人间的最新科技改造了自己的弓箭,使得丘比特之箭的射程大大增加。这样,射中有缘人的机会也增加了不少。

情人节(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相关推荐

  1. 316C Tidying Up 费用流的完美匹配

    题目链接: http://codeforces.com/gym/257279/problem/C 题意: 你有一个 n∗mn*mn∗m 的矩阵,这些方格中有数字 1−n∗m/21-n*m/21−n∗m ...

  2. 【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 ...

  3. 【SPOJ - SCITIES】Selfish Cities (二分图最优匹配,最大费用流)

    题干: Far, far away there is a world known as Selfishland because of the nature of its inhabitants. Ha ...

  4. hdu 3395(费用流,二分图的最大权匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3395 解题思路: 这个构图很容易出错,最开始都容易想,把每个点拆开,分为攻击和被攻击的,建图如下: 源 ...

  5. UVA1411 Ants(带权二分图的最大完美匹配、zkw费用流)

    题解 给定一些黑点白点,要求一个黑点链接一个白点并且线段不相交(转成二分图最大权匹配使用费用流解决)<训练指南>P351 输出方案:满流即为答案(满流是指这条路的流量跑满了,也就是说edg ...

  6. [NOI2012]美食节——费用流(带权二分图匹配)+动态加边

    题目描述 小M发现,美食节共有n种不同的菜品.每次点餐,每个同学可以选择其中的一个菜品.总共有m个厨师来制作这些菜品.当所有的同学点餐结束后,菜品的制作任务就会分配给每个厨师.然后每个厨师就会同时开始 ...

  7. upc 6445: 棋盘V (网络流费用流解决匹配问题)

    6445: 棋盘V 时间限制: 1 Sec  内存限制: 128 MB 提交: 325  解决: 31 [提交] [状态] [讨论版] [命题人:admin] 题目描述 有一块棋盘,棋盘的边长为100 ...

  8. 【BZOJ2539】【codevs1221】丘比特的烦恼,trie树+几何判断+费用流

    传送门1 传送门2 写在前面:写90分不如写10分难 思路:很简单的思路!trie把字符串变成数字编号,邻接矩阵记录点之间的边权,判断是否在射程内或线段上是否有人不用什么斜率!用两点距离!然后直接上费 ...

  9. BZOJ1150[CTSC2007]数据备份Backup——模拟费用流+堆+链表

    题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游 ...

最新文章

  1. 效率提升多倍, 推荐值得收藏40 个命令总结
  2. [原创]java WEB学习笔记02:javaWeb开发的目录结构
  3. 奶块哪种服务器人最多,奶块什么服务器人多 | 手游网游页游攻略大全
  4. python实现文件上传预览_前端实现文件预览功能
  5. 基于jquery的上传插件Uploadify 3.1.1在MVC3中的使用
  6. linux重启was控制台报错,IHS启动时报错,从was控制台传播插件失败
  7. lora信号测试小助手_LoRa是如何通过CAD来实现唤醒的
  8. c++调用cplex求解例子_c++调用CPLEX环境配置
  9. java利用栈求复杂表达式_java中的栈Stack的基本使用和应用(二) ——利用栈计算合法的算术表达,中缀表达式转后缀表达式...
  10. Centos下磁盘管理的常用命令记录(如查找大文件)
  11. matlab动态显示鼠标值,动态显示鼠标的坐标值和像素值
  12. 实现手机访问网站时点击手机号码直接拨打电话的功能
  13. 没解决:MMC不能打开文件MSC可能是由于文件不存在,不是一个MMC控制台,或者用后来的MMC版本创建。也可能你没有访问此文件的足够权限
  14. HTML全面深入学习-用label获得焦点
  15. 51单片机的家居空气质量监测系统proteus仿真设计
  16. Python绘制一箭穿双心 动画代码
  17. WebDay05 JQuery框架
  18. filter 过滤器
  19. win高分屏下Qt程序的界面适配处理
  20. 树莓派:10行代码体验红外检测

热门文章

  1. [kafka]kafka中的zookeeper是做什么的?
  2. 心理测评软件php mysql_心理测评系统
  3. 自学前端第十八天:CSS精准定位position
  4. error: undefined reference to ‘typeinfo for android::RefBase‘ hidl_death_recipient
  5. mybatis collection 子查询,嵌套查询,解决分页问题
  6. 《大长今》分集剧情介绍(下)
  7. kankan转载:anddroid卡牌效果实现
  8. linux系统日志怎么退出,linux系统日志的清除
  9. 统计图表导入word,用到echarts,highcharts,amcharts,jfreechart
  10. 【笔记】——MySQL数据库——基础知识-——快速回顾——(加深印象篇)