题意:

有n个圆,每个圆的中心和半径和一个频率都给定,只有一个频率最高的789为紫色,只有一个最低的400为红色,规则如下:

1.当两个圆严格相交时,且人是从红色到紫色的方向运动时可以由低频率向高频率移动

2.当两个圆严格相交时,且人是从紫色到红色的方向运动时可以由高频率向低频率运动

3.除了红色的圆以外,离开某个圆之后就会消失(即只能走一次)

思路:

如果一开始红色和紫色就相交,则存在合理方案。否则

本题要求是先从红点出发,经过紫点之后再返回红点,如果以红点作为源点,网络流算法不能先到达一个T,然后再到达另一个T,

所以不妨以紫点作为源点sp,红点作为tp,将点拆分成i和i+n,然后建边(i, i+n, 1), (sp, sp+n, 2)如果两个圆严格相交,设i的频率

大于j的频率,则(i+n, j, 1)反之(j+n, i, 1),求出最大流为2则存在合理方案。把S(紫色) -> T(红色)的两个流中的一个流反向,就可以形成一个

T -> S -> T的方案。

#include <bits/stdc++.h>
using namespace std;const int maxn = 300 + 5;
const int inf = 0x3f3f3f3f;
struct point{double f;double x, y, r;
} p[maxn];
struct edge{int to, w, next;
} ed[maxn*maxn<<2];
int k, n, sp, tp;
int head[maxn<<1], tot, d[maxn<<1], maxflow;
inline void init(){memset( head, -1, sizeof(head) );tot = 1;
}inline double getlen2( const point a, const point b ){double x1 = a.x, x2 = b.x;double y1 = a.y, y2 = b.y;return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
}inline bool judge(point a, point b){return getlen2(a, b) < (a.r+b.r)*(a.r+b.r);
}inline void add( int u, int v, int w ){ed[++tot].to = v; ed[tot].w = w; ed[tot].next = head[u]; head[u] = tot;ed[++tot].to = u; ed[tot].w = 0; ed[tot].next = head[v]; head[v] = tot;
}inline bool bfs(){memset( d, 0, sizeof(d) );queue<int> q;d[sp] = 1;q.push(sp);while( !q.empty() ){int x = q.front();q.pop();for( int i=head[x]; i!=-1; i=ed[i].next ){int y = ed[i].to;if( ed[i].w && !d[y] ){d[y] = d[x] + 1;q.push(y);if( y==tp ) return 1;}}}return 0;
}inline int dfs( int x, int flow ){if( x==tp ) return flow;int res = flow, k;for( int i=head[x]; i!=-1&&res; i=ed[i].next ){int y = ed[i].to;if( ed[i].w && d[y]==d[x]+1 ){k = dfs( y, min( res, ed[i].w ) );if(!k) d[y] = 0;ed[i].w -= k;ed[i^1].w += k;res -= k;}}return flow - res;
}inline void dinic(){int flow = maxflow = 0;while( bfs() ){while( flow = dfs(sp, inf) ) maxflow += flow;}
}int main(){// freopen("in.txt", "r", stdin);scanf("%d", &k);while( k-- ){scanf("%d", &n);init();for( int i=1; i<=n; i++ ){scanf("%lf%lf%lf%lf", &p[i].f, &p[i].x, &p[i].y, &p[i].r);if( p[i].f==400.0 ) tp = i;else if( p[i].f==789.0 ) sp = i;else add( i, i+n, 1 );}if( judge( p[sp], p[tp] ) ){puts("Game is VALID");continue;}add( sp, sp+n, 2 );for( int i=1; i<=n; i++ )for( int j=i+1; j<=n; j++ ){if( judge(p[i], p[j]) ){if( p[i].f<p[j].f ) add( j+n, i, 1 );else add( i+n, j, 1 );}}dinic();// cout << maxflow << endl;if( maxflow>=2 ) puts("Game is VALID");else puts("Game is NOT VALID");}return 0;
}
/*
Game is NOT VALID
Game is VALID*/

转载于:https://www.cnblogs.com/WAautomaton/p/11143483.html

HDU4183 Pahom on Water(来回走最大流,一个点只经过一次)相关推荐

  1. HDU 4183 Pahom on Water 来回走不重复点的网络流

    题目来源:HDU 4183 Pahom on Water 题意:若干个区域 每个区域有一个值 区域是圆 给出圆心和半径 从起点(值为400.0)到终点(值为789.0)满足走相交的圆 并且值必须递增 ...

  2. HDU4183 Pahom on Water(网络流之最大流)

    题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4183 题意:给你n个点,每个点有一个频率,原点坐标和半径,i到j可达当且仅当i的频率小于j的频率并且两 ...

  3. HDU4183 Pahom on Water(最大流)

    题目好长好难懂0 0,直接翻了翻网上的题解. 大意是这样的:有n(2≤n≤300)n(2 \leq n\leq 300)个点,每个点有个频率f(400.0≤f≤789.0)f(400.0 \leq f ...

  4. hdu 4183 Pahom on Water 网络流

    题意   二维空间上有一些点,每个点有一个半径r和频率f,要从某一个点S走到另一个点T,然后再从T回到S.从S到T时,如果两个点表示的圆相交并且第一个点小于第二个点的频率的,那么能从第一个点到第二个点 ...

  5. 编写程序,生成一种贯穿10*10字符数组(初始时全为字符'.')的“随机步法”。程序必须随机地从一个元素“走到”另一个元素,每次都向上、向下、向左或向右移动一个元素位置

    编写程序,生成一种贯穿10*10字符数组(初始时全为字符'.')的"随机步法".程序必须随机地从一个元素"走到"另一个元素,每次都向上.向下.向左或向右移动一个 ...

  6. 从端游走到手游:未来只会有两大方向

    从端游走到手游:未来只会有两大方向 作者:李瀛寰2013-11-14 00:22评论: 9 本文导航 第1页:姚仙:剑仙奇侠背后的爱情 第2页:极致:游戏文化的核心 第3页:金亨泰:唯美的艺术感染力 ...

  7. python自动化扫描,多线程枚举获取wifi信息,让你走在任何一个地方都能上网

    python自动化扫描,多线程枚举获取wifi信息,让你走在任何一个地方都能上网. 无线网络在无线局域网的范畴是指"无线相容性认证",实质上是一种商业认证,同时也是一种无线联网技术 ...

  8. hdu 4183 Pahom on Water 最大流

    一个平面上有n个圆, 每个圆都有一个频率, 有两个频率为400和789的圆, 问是否能从频率为400的圆走到频率为789的圆, 并从频率为789的圆走回频率为400的圆, 并且除了频率为400的圆, ...

  9. HDU -- 4183 Pahom on Water(最大流)

    题目大意: 二维空间上有一些点,每个点有一个频率,圆心坐标,半径,设s点是频率最低的点,t是频率最高的点,要求从s点走到t点,在从点t回到点s.当从s走到t时,要求两个点表示的园相交并且第一个点的频率 ...

最新文章

  1. pandas使用groupby函数按照多个分组变量进行分组聚合统计、使用agg函数计算分组的多个统计指标(grouping by multiple columns in dataframe)
  2. RTX 2080时代,如何打造属于自己的深度学习机器
  3. 知道这些用于数据科学和机器学习的GitHub存储库和Reddit主题吗?
  4. Centos7 使用Docker 部署Nginx+mysql+tomcat+调试联通_03
  5. MFC中,多个Button响应同一个事件
  6. ecshop ipdel.php,去除Ecshop后台调用api.ecshop.com官网后门代码
  7. 从零基础入门Tensorflow2.0 ----六、27 卷积神经网络(2)
  8. ASP.NET MVC搭建项目后台UI框架—9、服务器端排序
  9. Win10系统安装Ubuntu系统
  10. centos7下载php7.4
  11. U盘分区以及启动U盘的制作
  12. qca wlan wifi modules解析三
  13. git add所有文件
  14. 自然语言处理系列五》新词发现与短语提取》短语提取
  15. 根据个人情况以及Java程序员面试宝典总结的需要复习的知识点
  16. Linux Signal信号详解
  17. c语言自制服务器之间调用文件夹,C语言实现一种简单的应用服务器内部数据结构的思路(三)...
  18. hightcharts-vue 蜡烛图 股票绘图 candlestick
  19. Python 计算思维训练——字典与字符串练习(一)
  20. WLAN、LAN和WAP都是什么?

热门文章

  1. 小米9京东预约破百万!明日正式首销:售价2999元起
  2. 微信年终奖人均280万?腾讯张军:不可能 醒一醒吧!
  3. 十大笔记本品牌型号命名规则【惠普】
  4. tomcat xjar 加密_XJar Spring Boot JAR 安全加密运行工具
  5. python怎么向列表中添加内容_Python中向List添加元素方法
  6. nodejs async await promise理解
  7. linux网络子系统研究:数据收发简略流程图
  8. Java 替换字符串中的回车换行符的方法
  9. java如何记住登录状态_Spring security实现记住我下次自动登录功能过程详解
  10. python课后题答案第一章_python核心编程课后习题解答第一章