Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 695  Solved: 260
[Submit][Status][Discuss]

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

HINT

 

Source

Trie树或map+费用流或km(本蒟蒻不会)

坑点:匹配度小于0也可以匹配

另外不知道为什么写的邻接表跑不动。。

于是改用矩阵。

快的飞起\(^o^)/

屠龙宝刀点击就送

#include <cstring>
#include <string>
#include <cstdio>
#include <queue>
#include <cmath>
#define inf 0x7fffffff
#define fwq 0xefefefef
#define N 200 using namespace std;
typedef long long LL;
char name[];
bool vis[N];
int f[N],trie[N*][],siz,Num[N*],pre[N],dis[N],Max,n,Map[N][N],flow[N][N],x[N],y[N];
void ins(char *a,int num)
{
int p=;
for(char *q=a;*q;++q)
{
int id=*q-'a';
if(!trie[p][id]) trie[p][id]=++siz;
p=trie[p][id];
}
Num[p]=num;
}
int Get(char *a)
{
int p=;
for(char *q=a;*q;++q)
{
int id=*q-'a';
p=trie[p][id];
}
return Num[p];
}
inline int min(int a,int b) {return a>b?b:a;}
bool spfa(int s,int t)
{
for(int i=s;i<=t;++i) f[i]=inf,dis[i]=fwq,vis[i]=;
dis[s]=pre[s]=;
queue<int>q;
q.push(s);
for(int now;!q.empty();)
{
now=q.front();q.pop();
vis[now]=;
for(int j=s;j<=t;++j)
{
if(dis[j]<dis[now]+Map[now][j]&&flow[now][j]>)
{
dis[j]=dis[now]+Map[now][j];
pre[j]=now;
f[j]=min(f[now],flow[now][j]);
if(!vis[j])
{
vis[j]=;
q.push(j);
}
}
}
}
return dis[t]!=fwq;
}
int update(int s,int t)
{
int x=f[t];
for(int i=t;i!=s&&i;i=pre[i])
{
flow[pre[i]][i]-=x;
flow[i][pre[i]]+=x;
}
return dis[t]*x;
}
int Dinic(int s,int t)
{
int ans=;
for(;spfa(s,t);ans+=update(s,t));
return ans;
}
inline bool iscross(int a,int b,int c)
{
if((x[a]-x[b])*(y[b]-y[c])==(x[b]-x[c])*(y[a]-y[b]))
{
if (y[a]==y[c])
return (x[a]<x[b]&&x[b]<x[c])||(x[c]<x[b]&&x[b]<x[a]);
else
return (y[a]<y[b]&&y[b]<y[c])||(y[c]<y[b]&&y[b]<y[a]);
}
return false;
}
LL calc(LL x1,LL y1,LL x2,LL y2) {return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);}
void init()
{
for(int i=;i<=n;++i)
for(int j=n+;j<=n*;++j)
if(calc(x[i],y[i],x[j],y[j])>Max*Max)
Map[i][j]=;
else
{
int k;
for (k=;k<=n*+;k++)
if (k!=i && k!=j && iscross(i,k,j))
break;
Map[i][j]=k>n*?:;
}
}
int Main()
{
scanf("%d%d",&Max,&n);
for(int i=;i<=n*;++i)
{
scanf("%d%d",&x[i],&y[i]);
scanf("%s",name);
int len=strlen(name);
for(int j=;j<len;++j) if(name[j]>='A'&&name[j]<='Z') name[j]+=;
ins(name,i);
}
init();
char name1[],name2[];
for(int yf;;)
{
scanf("%s",name1);
if(name1[]=='E'&&name1[]=='n'&&name1[]=='d'&&strlen(name1)==) break;
int len=strlen(name1);
for(int i=;i<len;++i) if(name1[i]>='A'&&name1[i]<='Z') name1[i]+=;
scanf("%s",name2);
len=strlen(name2);
for(int i=;i<len;++i) if(name2[i]>='A'&&name2[i]<='Z') name2[i]+=;
int a=Get(name1),b=Get(name2);
if(a>b) swap(a,b);
scanf("%d",&yf);
if(Map[a][b]!=) Map[a][b]=yf,Map[b][a]=-yf,flow[a][b]=,flow[b][a]=;
}
int s=,t=n*+;
for(int i=;i<=n;++i) Map[s][i]=,flow[s][i]=,Map[i][s]=,flow[i][s]=;
for(int i=n+;i<=n*;++i) Map[i][t]=,flow[i][t]=,Map[t][i]=,flow[t][i]=;
for(int i=;i<=n;++i)
for(int j=n+;j<=n*;++j)
if(Map[i][j]==)
flow[i][j]=,flow[j][i]=,Map[i][j]=,Map[j][i]=-;
printf("%d\n",Dinic(s,t));
return ;
}
int sb=Main();
int main(int argc,char *argv[]) {;}

BZOJ 2539: [Ctsc2000]丘比特的烦恼的更多相关文章

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

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

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

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

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

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

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

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

  5. [CTSC2000]丘比特的烦恼

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

  6. BZOJ 1005 [HNOI2008] 明明的烦恼(组合数学 Purfer Sequence)

    题目大意 自从明明学了树的结构,就对奇怪的树产生了兴趣...... 给出标号为 1 到 N 的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为 N( ...

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

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

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

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

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

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

随机推荐

  1. 51Nod - 1640 天气晴朗的魔法 大+小生成树(最大值最小)/二分

    天气晴朗的魔法 这样阴沉的天气持续下去,我们不免担心起他的健康.   51nod魔法学校近日开展了主题为“天气晴朗”的魔法交流活动.   N名魔法师按阵法站好,之后选取N - 1条魔法链将所有魔法师的 ...

  2. SCUT - 278 - 谜题#020 - 左偏树

    https://scut.online/p/278 第一次遇到不需要并查集的左偏树. #include<bits/stdc++.h> using namespace std; typede ...

  3. 3dmax 法线重置

    从一个模型分离部位时,分离出的部分,面法线发生了混乱,左边原始模型,右边分离后 重置法线方法 对模型(比如对分离出的下半身)添加 EditoNormal修改器 选中模型部位 添加Edit Normal ...

  4. ue4 官网IK流程记录

    基本流程 角色蓝图构造 角色蓝图 角色蓝图中新建的函数IK Foot Trace AnimGraph事件 这里注意下Make Vector时把z方向的偏移量设置到了X上 猜测原因是效应器的x方向跟世界 ...

  5. ue4 motage

    Montage是什么 一个(可以自由拼接动画的)动画剪辑,通过slot,在任意时候由玩家主动向动画系统push自己制作的动画剪辑 Montage用途 上图是一个近身攻击动画,含有 3 个片段 [开始. ...

  6. nginx反向代理解决跨域问题,使本地调试更方便

    我们可能都会遇到一个这样的问题,线上环境是https://...,本地启动了项目,域名是localhost:8000等,本地想要访问线上的接口,直接在本地调试,却提示跨域,这个时候我们可以配置ngin ...

  7. JQuery Easyui/TopJUI 用JS创建数据表格并实现增删改查功能

    JQuery Easyui/TopJUI 用JS创建数据表格并实现增删改查功能 html <table id="productDg"></table> &l ...

  8. IOS字符串截取保留小数点后两位

    -(NSString*)getTheCorrectNum:(NSString*)tempString { //计算截取的长度 NSUInteger endLength = tempString.len ...

  9. 判断jquery对象是否在执行动画

    function isAnimated($obj){ var flag=false; if($obj.is(":animated")){ flag=true; } return f ...

  10. CentOS yum源的配置

    yum操作 1.用YUM安装软件包命令:yum install 2.用YUM删除软件包命令:yum remove 3.使用YUM查找软件包命令:yum search4.列出所有可安装的软件包命令:yu ...