Description

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

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

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

情人节(Valentine's day)的午夜零时,丘比特开始了自己的工作。他选择了一组数目相等的男女,感应到他们互相之间的缘分大小,并依此射出了神箭,使他们产生爱意。他希望能选择最好的方法,使被他选择的每一个人被射中一次,且每一对被射中的人之间的缘分的和最大。

当然,无论丘比特怎么改造自己的弓箭,总还是存在缺陷的。首先,弓箭的射程尽管增大了,但毕竟还是有限的,不能像月下老人那样,做到“千里姻缘一线牵”。其次,无论怎么改造,箭的轨迹终归只能是一条直线,也就是说,如果两个人之间的连线段上有别人,那么莫不可向他们射出丘比特之箭,否则,按月下老人的话,就是“乱点鸳鸯谱”了。

作为一个凡人,你的任务是运用先进的计算机为丘比特找到最佳的方案。

Input

输入文件第一行为正整数k,表示丘比特之箭的射程,第二行为正整数n(n<30),随后有2n行,表示丘比特选中的人的信息,其中前n行为男子,后n行为女子。每个人的信息由两部分组成:他的姓名和他的位置。姓名是长度小于20且仅包含字母的字符串,忽略大小写的区别,位置是由一对整数表示的坐标,它们之间用空格分隔。格式为Name x y。输入文件剩下的部分描述了这些人的缘分。每一行的格式为Name1 Name2 p。Name1和Name2为有缘人的姓名,p是他们之间的缘分值(p为小于等于255的正整数)。以一个End作为文件结束标志。每两个人之间的缘分至多只被描述一次。如果没有被描述,则说明他们缘分值为1。

Output

输出文件仅一个正整数,表示每一对被射中的人之间的缘分的总和。这个和应当是最大的。

Sample Input

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

Sample Output

65


二分图带权匹配,除了字符串处理,以及判断两点之间是否有其他点麻烦点,就可以直接上KM了

/*program from Wolfycz*/
#include<map>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x7f7f7f7f
#define sqr(x) ((x)*(x))
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
inline int read(){
int x=0,f=1;char ch=getchar();
for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
for (;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+ch-'0';
return x*f;
}
inline void print(int x){
if (x>=10) print(x/10);
putchar(x%10+'0');
}
const int N=35;
map<string,int>mp;
string s,t;
int bx[N],by[N],gx[N],gy[N],path[N],lx[N],ly[N],val[N][N];
bool visx[N],visy[N];
int dis,n;
bool check(int a,int b){
int ox=bx[a],oy=by[a],ex=gx[b],ey=gy[b];
if (sqrt(1.0*sqr(ox-ex)+1.0*sqr(oy-ey))>dis) return 0; //距离过大
if (ox>ex) swap(ox,ex),swap(oy,ey);
for (int i=1;i<=n;i++){ //判断中间是否有点
if (bx[i]<min(ox,ex)||bx[i]>max(ox,ex)||by[i]<min(oy,ey)||by[i]>max(oy,ey)||i==a) continue;
if (ox==ex) return 0; //三点共线
double k1=1.0*(by[i]-oy)/(bx[i]-ox);
double k2=1.0*(ey-oy)/(ex-ox);
if (k1==k2) return 0; //用斜率判断
}
for (int i=1;i<=n;i++){ //与上面类似
if (gx[i]<min(ox,ex)||gx[i]>max(ox,ex)||gy[i]<min(oy,ey)||gy[i]>max(oy,ey)||i==b) continue;
if (ox==ex) return 0;
double k1=1.0*(gy[i]-oy)/(gx[i]-ox);
double k2=1.0*(ey-oy)/(ex-ox);
if (k1==k2) return 0;
}
return 1;
}
bool dfs(int x){
visx[x]=1;
for (int y=1;y<=n;y++){
if (!visy[y]&&lx[x]+ly[y]==val[x][y]){
visy[y]=1;
if (path[y]<0||dfs(path[y])){
path[y]=x;
return 1;
}
}
}
return 0;
}
int KM(){
int sum=0;
memset(lx,128,sizeof(lx));
memset(path,-1,sizeof(path));
for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) lx[i]=max(lx[i],val[i][j]);
for (int i=1;i<=n;i++){
while (1){
memset(visx,0,sizeof(visx));
memset(visy,0,sizeof(visy));
if (dfs(i)) break;
int d=inf;
for (int x=1;x<=n;x++) if (visx[x])
for (int y=1;y<=n;y++) if (!visy[y])
d=min(d,lx[x]+ly[y]-val[x][y]);
for (int j=1;j<=n;j++) if (visx[j]) lx[j]-=d;
for (int j=1;j<=n;j++) if (visy[j]) ly[j]+=d;
}
}
for (int i=1;i<=n;i++) if (path[i]!=-1) sum+=val[path[i]][i];
return sum;
}
int main(){
dis=read(),n=read();
for (int i=1;i<=n;i++){
bx[i]=read(),by[i]=read();
cin>>s;
int len=s.length();
for (int j=0;j<len;j++) if ('A'<=s[j]&&s[j]<='Z') s[j]+=32; //大小写无区别
mp[s]=i; //存男生
s.clear();
}
for (int i=1;i<=n;i++){
gx[i]=read(),gy[i]=read();
cin>>s;
int len=s.length();
for (int j=0;j<len;j++) if ('A'<=s[j]&&s[j]<='Z') s[j]+=32;
mp[s]=i+n; //存女生
s.clear();
}
for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) val[i][j]=-inf;
while (true){
cin>>s;
if (s=="End") break;
cin>>t;
int v=read(),lens=s.length(),lent=t.length();
for (int i=0;i<lens;i++) if ('A'<=s[i]&&s[i]<='Z') s[i]+=32;
for (int i=0;i<lent;i++) if ('A'<=t[i]&&t[i]<='Z') t[i]+=32;
int x=mp[s],y=mp[t];
if (x>y) swap(x,y); //规定顺序
y-=n;
if (check(x,y)) val[x][y]=v;
}
for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) if (i!=j&&check(i,j)) val[i][j]=max(val[i][j],1);
printf("%d\n",KM());
return 0;
}

[CTSC2000]丘比特的烦恼的更多相关文章

  1. BZOJ2539: [Ctsc2000]丘比特的烦恼

    BZOJ2539: [Ctsc2000]丘比特的烦恼 Description 随着社会的不断发展,人与人之间的感情越来越功利化. 最近,爱神丘比特发现,爱情也已不再是完全纯洁的了. 这使得丘比特很是苦 ...

  2. cogs 290. [CTSC2000] 丘比特的烦恼

    290. [CTSC2000] 丘比特的烦恼 ★★★   输入文件:cupid.in   输出文件:cupid.out   简单对比时间限制:1 s   内存限制:128 MB 随着社会的不断发展,人 ...

  3. KM算法及其优化的学习笔记&&bzoj2539: [Ctsc2000]丘比特的烦恼

    感谢  http://www.cnblogs.com/vongang/archive/2012/04/28/2475731.html 这篇blog里提供了3个链接……基本上很明白地把KM算法是啥讲清楚 ...

  4. 【刷题】BZOJ 2539 [Ctsc2000]丘比特的烦恼

    Description 随着社会的不断发展,人与人之间的感情越来越功利化.最近,爱神丘比特发现,爱情也已不再是完全纯洁的了.这使得丘比特很是苦恼,他越来越难找到合适的男女,并向他们射去丘比特之箭.于是 ...

  5. BZOJ 2539: [Ctsc2000]丘比特的烦恼

    Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 695  Solved: 260[Submit][Status][Discuss] Description ...

  6. 图论(KM算法):COGS 290. [CTSC2008] 丘比特的烦恼

    290. [CTSC2008] 丘比特的烦恼 ★★★   输入文件:cupid.in   输出文件:cupid.out   简单对比 时间限制:1 s   内存限制:128 MB 随着社会的不断发展, ...

  7. bzoj2539 丘比特的烦恼、黑书P333 (最优二分图匹配)

      丘比特的烦恼 题目描述 Description 随着社会的不断发展,人与人之间的感情越来越功利化.最近,爱神丘比特发现,爱情也已不再是完全纯洁的了.这使得丘比特很是苦恼,他越来越难找到合适的男女, ...

  8. 1891: 丘比特的烦恼 - BZOJ

    Description 随着社会的不断发展,人与人之间的感情越来越功利化.最近,爱神丘比特发现,爱情也已不再是完全纯洁的了.这使得丘比特很是苦恼,他越来越难找到合适的男女,并向他们射去丘比特之箭.于是 ...

  9. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

随机推荐

  1. Meteor Blaze

    Blaze是Meteor 软件包用于构建现场反应模板. Render方法 这种方法被用于绘制模板到DOM.首先,我们将创建 myNewTemplate 之后渲染. 我们增加 myContainer 这 ...

  2. [Javascript] Link to Other Objects through the JavaScript Prototype Chain

    Objects have the ability to use data and methods that other objects contain, as long as it lives on ...

  3. 使用MySQL Workbench进行数据库设计——MySQL Workbench用法总结

    转载请注明出处:http://blog.csdn.net/dongdong9223/article/details/48318877 本文出自[我是干勾鱼的博客] 1 简单介绍 MySQL Workb ...

  4. http://vdceye.com/ 全新页面上线

    vdceye manager home page

  5. react 组件之间传值

    谈及React时,就会想到一个很重要的思想,就是组件化思想.它将可以重用的部分进行组件化开发,形成一个个相对独立的组件,那么组件化后,你也会提出些疑问,组件与组件之间,将怎样进行信息的传递呢?下面来介 ...

  6. FancyCoverFlow

    https://github.com/davidschreiber/FancyCoverFlow

  7. the first week study

    1.In 1989, a man named Guido create "python" as a kind of computer languages. And now we u ...

  8. 比 git log 更强大的 git reflog

    最近做了个骚操作 git checkout commitId 修改了部分内容 git add . git commit -m '修改了些东西'   -> 此时git 会自动生成一个新的 comm ...

  9. 密码过期导致Oracle process耗尽问题

    oracle忽然连不上! 大致是报这样的错: ORA-12516: TNS: 监听程序找不到符合协议堆栈要求的可用处理程序 ORA-12520: TNS: 监听程序无法为请求的服务器类型找到可用的处理 ...

  10. 2016/3/31 拾遗 php字符串中 转义字符 “ ’‘ ” ’ “” ‘ " \’ ' ' \‘ " " \" '' \ " " 使用

    <?php echo $str_string1='甲问:"你在哪里学的PHP?"'; echo "<br />"; echo $str_str ...