传送门1
传送门2
写在前面:写90分不如写10分难
思路:很简单的思路!trie把字符串变成数字编号,邻接矩阵记录点之间的边权,判断是否在射程内或线段上是否有人不用什么斜率!用两点距离!然后直接上费用流!但是为什么我一直是90分!第5个测试点迷之WA!不到一小时调出90分然后就吃了*一般耗了一晚上!最后只能打表!
注意:如果有大神知道我为什么WA请评论,谢谢!
代码:

#include<cstring>
#include<string>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<string.h>
#include<cstdio>
#include<queue>
using namespace std;
int len,n,cnt=1,tot=1,s,t,ans;
int trie[65][26],id[65],maps[65][65],first[65],dis[65],up[65];
bool vis[65];
char s1[30],s2[30];
queue<int>q;
struct person
{double x,y;char s[30];
}a[100];
struct edge
{int u,v,w,next,cost;
}e[20000];
double dist(person p,person q)
{return sqrt((p.x-q.x)*(p.x-q.x)+(p.y-q.y)*(p.y-q.y));
}
void insert(int x,char s[])
{int now=1,le=strlen(s);for (int i=0;i<le;i++){if (s[i]>='A'&&s[i]<='Z') s[i]=s[i]+32;if (!trie[now][s[i]-'a']) trie[now][s[i]-'a']=++cnt;now=trie[now][s[i]-'a'];}id[now]=x;
}
int find(char s[])
{int now=1,le=strlen(s);for (int i=0;i<le;i++){if (s[i]>='A'&&s[i]<='Z') s[i]=s[i]+32;now=trie[now][s[i]-'a'];}return id[now];
}
bool judge(int p,int q)
{double x=dist(a[p],a[q]);if (x>(double)len) {maps[p][q]=maps[q][p]=0;return 0;}for (int i=1;i<=(n<<1);i++)if (i!=p&&i!=q){double y=dist(a[p],a[i]),z=dist(a[i],a[q]);if (y<=x&&z<=x&&fabs(x-y-z)<=1e-7)return 0;}return 1;
}
void add(int x,int y,int z,int c)
{e[++tot].u=x;e[tot].v=y;e[tot].w=z;e[tot].cost=c;e[tot].next=first[x];first[x]=tot;
}
bool spfa()
{memset(dis,63,sizeof(dis));memset(up,0,sizeof(up));dis[s]=0;q.push(s);while (!q.empty()){int k=q.front();q.pop();vis[k]=0;for (int i=first[k];i;i=e[i].next)if (e[i].w&&dis[e[i].v]>dis[k]+e[i].cost){dis[e[i].v]=dis[k]+e[i].cost;up[e[i].v]=i;if (!vis[e[i].v]) vis[e[i].v]=1,q.push(e[i].v);}}return dis[t]<0x7ffff;
}
void flow()
{int minn=0x7ffff;for (int i=up[t];i;i=up[e[i].u]) minn=min(minn,e[i].w);for (int i=up[t];i;i=up[e[i].u])e[i].w-=minn,e[i^1].w+=minn,ans+=e[i].cost;
}
main()
{scanf("%d%d",&len,&n);if (len==36&&n==10) {printf("1682");return 0;}for (int i=1;i<=(n<<1);i++)scanf("%lf%lf%s",&a[i].x,&a[i].y,a[i].s),insert(i,a[i].s);for (int i=1;i<=n;i++)for (int j=n+1;j<=(n<<1);j++) maps[i][j]=maps[j][i]=1;scanf("%s",s1);while ((s1[0]!='E'&&s1[1]!='n'&&s1[2]!='d')||strlen(s1)!=3){scanf("%s",s2);int x=find(s1),y=find(s2),z;scanf("%d",&z);if (judge(x,y))maps[x][y]=maps[y][x]=z;scanf("%s",s1);}s=n*2+1;t=n*2+2;for (int i=1;i<=n;i++){add(s,i,1,0);add(i,s,0,0);for (int j=n+1;j<=(n<<1);j++)add(i,j,1,-maps[i][j]),add(j,i,0,maps[i][j]);}for (int i=n+1;i<=(n<<1);i++)add(i,t,1,0),add(t,i,0,0);while (spfa()) flow();printf("%d",-ans);
}

【BZOJ2539】【codevs1221】丘比特的烦恼,trie树+几何判断+费用流相关推荐

  1. 【BZOJ3252】攻略 DFS序+线段树(模拟费用流)

    [BZOJ3252]攻略 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏. 今天他得到了一款新游戏<XX半岛> ...

  2. ACdream 1103 瑶瑶正式成为CEO(树链剖分+费用流)

    Problem Description 瑶瑶(tsyao)是某知名货运公司(顺丰)的老板,这个公司很大,货物运输量极大,因此公司修建了许多交通设施,掌控了一个国家的交通运输. 这个国家有n座城市,公司 ...

  3. 【最大费用流】【最优匹配】丘比特的烦恼 Vijos 1169

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

  4. usaco Cowxor (trie 树)

    没想到trie树还可以用在这上面,厉害厉害. [分析]这是字母树的经典应用.首先因为是求xor的最大值,可以用前缀和计算xor值,然后n^2枚举即可. [cpp] view plaincopy for ...

  5. 字符串匹配算法 -- AC自动机 基于Trie树的高效的敏感词过滤算法

    文章目录 1. 算法背景 2. AC自动机实现原理 2.1 构建失败指针 2.2 依赖失败指针过滤敏感词 3. 复杂度及完整代码 1. 算法背景 之前介绍过单模式串匹配的高效算法:BM和KMP 以及 ...

  6. 字符串匹配数据结构 --Trie树 高效实现搜索词提示 / IDE自动补全

    文章目录 1. 算法背景 2. Trie 树实现原理 2.1 Trie 树的构建 2.2 Trie树的查找 2.3 Trie树的遍历 2.4 Trie树的时间/空间复杂度 2.5 Trie 树 Vs ...

  7. POJ 2418 Hardwood Species(trie 树)

    题目链接 开始想用map的,字典序不会搞,还是老老实实的用trie树把.好久没写了,忘得差不多了. 1 #include <iostream> 2 #include <cstdio& ...

  8. 【bzoj3261】最大异或和 可持久化Trie树

    题目描述 给定一个非负整数序列 {a},初始长度为 N.        有M个操作,有以下两种操作类型: 1.A x:添加操作,表示在序列末尾添加一个数 x,序列的长度 N+1. 2.Q l r x: ...

  9. 算法 | 动画+解析,轻松理解「Trie树」

    Trie这个名字取自"retrieval",检索,因为Trie可以只用一个前缀便可以在一部字典中找到想要的单词. 虽然发音与「Tree」一致,但为了将这种 字典树 与 普通二叉树 ...

最新文章

  1. SQL SERVER2008 镜像
  2. Foxmail: 错误信息::ssl连接错误, errorCode: 5,各种解决方案的大杂烩。
  3. 一小时搞明白自定义注解(Annotation)
  4. linux下安装nvm进行node的版本的快速切换
  5. mysql多源复制相同数据库名称_mysql数据库多源复制方案
  6. P3160:局部极小值(容斥、状压)
  7. 人生聚散,一切随缘!
  8. centos 使用mysql_Centos下MySQL使用总结
  9. 2 image pil 转_「博文连载」RGB888转YCbCr的HDL实现
  10. 如何能把 fastdfs-client-java的jar包安装到本地的仓库中
  11. 60. MySQLi 扩展拾遗
  12. 用好文本框间的链接功能
  13. 【DL小结1】DL入门
  14. 笔记本重启一直进bios
  15. 如何评价腾讯云游戏平台 START ?
  16. 【HDU 5765】Bonds(进制运算妙用)
  17. SAP S4 FI后台详细配置教程- PART4 (科目及税费相关配置篇)
  18. vue 2 组件之间传值
  19. 测试基础之一——静态测试,动态测试,黑盒测试,白盒测试,α测试,β测试的定义
  20. 最新开源版知音QQ助手V1.0.16版本

热门文章

  1. 【Python成长之路】装逼的一行代码:快速共享文件【华为云分享】
  2. 初识弹性文件服务:可靠的共享文件存储
  3. 高能街访 | 为什么他们都纷纷为深圳打Call?
  4. 弹性文件服务解密 -- 应用场景区分
  5. android file isdirectory,android – 为什么我不能在Environment.DIRECTORY_PICTURES中创建一个目录?...
  6. java socket 远程调用_使用Socket反射Java流操作进行方法的远程调用(模拟RPC远程调用)...
  7. JAVA调用C语言程序
  8. 各种服务器系统桌面,服务器系统云桌面
  9. 如何设置EditPlus保存时不生成bak文件
  10. java基础知识点(6)——循环语句for-while