读题显然是二分图匹配,看成guest与umbrella的匹配。匈牙利果断TLE了,其实时间卡的相当紧。HK过的,750ms。

  1 /* 2389 */
  2 #include <iostream>
  3 #include <string>
  4 #include <map>
  5 #include <queue>
  6 #include <set>
  7 #include <stack>
  8 #include <vector>
  9 #include <algorithm>
 10 #include <cstdio>
 11 #include <cmath>
 12 #include <ctime>
 13 #include <cstring>
 14 #include <climits>
 15 #include <cctype>
 16 using namespace std;
 17
 18 typedef struct {
 19     int v, next;
 20 } Edge_t;
 21
 22 const int maxn = 3005;
 23
 24 Edge_t E[maxn*maxn];
 25 int head[maxn], L;
 26 int dx[maxn], dy[maxn];
 27 int xpre[maxn], ypre[maxn];
 28 int gx[maxn], gy[maxn], gs[maxn];
 29 bool visit[maxn];
 30 int rt, n, m;
 31 int ans, dis;
 32
 33 void init() {
 34     L = 0;
 35     memset(head, -1, sizeof(head));
 36     memset(xpre, -1, sizeof(xpre));
 37     memset(ypre, -1, sizeof(ypre));
 38 }
 39
 40 void addEdge(int u, int v) {
 41     E[L].v = v;
 42     E[L].next = head[u];
 43     head[u] = L++;
 44 }
 45
 46 bool bfs() {
 47     int i, j, k;
 48     int u, v;
 49     queue<int> Q;
 50
 51     memset(dx, -1, sizeof(dx));
 52     memset(dy, -1, sizeof(dy));
 53     dis = INT_MAX;
 54
 55     for (i=0; i<m; ++i) {
 56         if (xpre[i] == -1) {
 57             Q.push(i);
 58             dx[i] = 0;
 59         }
 60     }
 61
 62     while (!Q.empty()) {
 63         u = Q.front();
 64         Q.pop();
 65         if (dx[u] > dis)
 66             break;
 67         for (i=head[u]; i!=-1; i=E[i].next) {
 68             v = E[i].v;
 69             if (dy[v] == -1) {
 70                 dy[v] = dx[u] + 1;
 71                 if (ypre[v] == -1) {
 72                     dis = dy[v];
 73                 } else {
 74                     dx[ypre[v]] = dy[v] + 1;
 75                     Q.push(ypre[v]);
 76                 }
 77             }
 78         }
 79     }
 80
 81     return dis!=INT_MAX;
 82 }
 83
 84 int dfs(int u) {
 85     int i, v;
 86     // Edge_t e;
 87
 88     for (i=head[u]; i!=-1; i=E[i].next) {
 89         v = E[i].v;
 90         if (!visit[v] && dy[v]==dx[u]+1) {
 91             visit[v] = true;
 92             if (ypre[v]!=-1 && dy[v]==dis)
 93                 continue;
 94             if (ypre[v]==-1 || dfs(ypre[v])) {
 95                 xpre[u] = v;
 96                 ypre[v] = u;
 97                 return 1;
 98             }
 99         }
100     }
101
102     return 0;
103 }
104
105 int HK() {
106     int ret = 0;
107
108     while (bfs()) {
109         memset(visit, false, sizeof(visit));
110         for (int i=0; i<m; ++i)
111             if (xpre[i] == -1)
112                 ret += dfs(i);
113     }
114     return ret;
115 }
116
117 int main() {
118     int i, j, k;
119     int t, tt;
120     int x, y;
121
122     #ifndef ONLINE_JUDGE
123         freopen("data.in", "r", stdin);
124         freopen("data.out", "w", stdout);
125     #endif
126
127     scanf("%d", &tt);
128     for (t=1; t<=tt; ++t) {
129         scanf("%d", &rt);
130         scanf("%d", &m);
131         init();
132         for (i=0; i<m; ++i)
133             scanf("%d %d %d", &gx[i], &gy[i], &gs[i]);
134         scanf("%d", &n);
135         for (i=0; i<n; ++i) {
136             scanf("%d %d", &x, &y);
137             for (j=0; j<m; ++j) {
138                 dis = gs[i] * rt;
139                 if ((x-gx[j])*(x-gx[j])+(y-gy[j])*(y-gy[j]) <= dis*dis)
140                     addEdge(j, i);
141             }
142         }
143         ans = HK();
144         printf("Scenario #%d:\n%d\n\n", t, ans);
145     }
146
147     #ifndef ONLINE_JUDGE
148         printf("%d\n", (int)clock());
149     #endif
150
151     return 0;
152 }

转载于:https://www.cnblogs.com/bombe1013/p/4432367.html

【HDOJ】2389 Rain on your Parade相关推荐

  1. HDUOJ 2389 Rain on your Parade

    HDUOJ 2389 Rain on your Parade 题目链接 Problem Description You're giving a party in the garden of your ...

  2. 【HDOJ】4602 Partition

    [题目]http://acm.hdu.edu.cn/showproblem.php?pid=4602 [报告] 直接贴上标程解题报告:(虽然有些纠结,试一下就弄通了..) Problem C. Par ...

  3. 【HDOJ】4602 Partition_天涯浪子_新浪博客

    [题目]http://acm.hdu.edu.cn/showproblem.php?pid=4602 [报告] 直接贴上标程解题报告:(虽然有些纠结,试一下就弄通了..) Problem C. Par ...

  4. 【HDOJ】1008 Elevator_天涯浪子_新浪博客

    [题目] http://acm.hdu.edu.cn/showproblem.php?pid=1008 [报告] 这是我在HDOJ里看到的最水的题目,至少目前为止. 题目里已经讲得很清楚了,模拟就能过 ...

  5. 【HDOJ】1022 Train Problem I_天涯浪子_新浪博客

    [题目]http://acm.hdu.edu.cn/showproblem.php?pid=1022 [报告] 模拟,直接模拟一个栈的运行就行了. [程序] // Task: 1022 Train P ...

  6. 【HDOJ】1003 Max Sum_天涯浪子_新浪博客

    [题目]http://acm.hdu.edu.cn/showproblem.php?pid=1003 [报告] 既然是子区间加和问题,可以用减法来处理.比如求[5..10]的和,可以直接用[1..10 ...

  7. 【HDOJ】4768 Flyer_天涯浪子_新浪博客

    [题目]http://acm.hdu.edu.cn/showproblem.php?pid=4768 [报告] 题目中已经说了,保证最多出现一个奇数,所以可以用异或的想法.把所有的数异或起来,如果最后 ...

  8. 【HDOJ】4699 Editor_天涯浪子_新浪博客

    [题目] http://acm.hdu.edu.cn/showproblem.php?pid=4699 [报告] 模拟题吧,本身不是很难. 最初的想法是用Splay tree写,然后疯掉了.苏牛说2B ...

  9. 【HDOJ】4704 Sum_天涯浪子_新浪博客

    [题目] http://acm.hdu.edu.cn/showproblem.php?pid=4704 [报告] S(K)显然就是N的K正整数划分数.所以SUM{S(K),1<=K<=N} ...

最新文章

  1. 一键部署dns服务_OpenShift : 通往云原生、DevOps、微服务和Serverless的大门
  2. thinkphp mysql 预处理_thinkPHP框架中执行原生SQL语句的方法
  3. 简颢集团“风口”下的投资机会 新能源共享领域的机遇与挑战
  4. PHP 免费视频教程
  5. 【正则表达式】JavaScript的exec()和search()方法
  6. MODIS数据的简介和下载(三)——MODIS数据下载方式(基于MODIS Web Service)
  7. Android ViewPager+TabHost实现首页导航
  8. leetcode 39. Combination Sum(回溯算法)
  9. java使用easypoi实现word模板导出
  10. c4d流体插件_C4D的Jet Fluids免费流体插件
  11. U盘不能复制超过4G的文件解决方法
  12. 草莓熊python turtle绘图(风车版)附源代码
  13. SpringBoot个人博客项目——相册模块开发(一)
  14. [BZOJ3503]-[CQOI2014]和谐矩阵-高斯消元
  15. 标学历年真题2016年版 真考题库1 电子表格
  16. Codeforces 1076 - 题集
  17. 色彩原理:三原色、色彩三要素、色彩模型
  18. 我奋斗了18年才和你坐在一起喝咖啡与我奋斗了18年不是为了和你一起喝咖啡
  19. Java进阶——注解
  20. linux驱动框架和驱动代码

热门文章

  1. 监控linux终端键盘输入,Linux内核实时监控键盘输入
  2. php文件夹重命名,PHP自动重命名文件实现方法
  3. linux硬连接脚本,linux 硬链接和软链接深入理解
  4. java jar 打包库_Java之 将程序打包成jar包
  5. github-markdown-css 使用简解,markdown文案格式优化(笔记)
  6. 潍坊理工的计算机专业怎么样,潍坊理工学院教育学专业怎么样
  7. ARM平板电脑移植Linux,iperf ARM移植
  8. 子恩域名授权系统2.0全解无加密无授权版盗版入库源码
  9. 苹果cms快鸭影视海螺精品模板
  10. 用ShopEx网上开店之安装Zend插件