题意:求两条路 能从 400.0 -> 789.0 且这两条路不想交(除了端点400,789 )

求只能走一次的网络流需要用到拆点,

将点i  拆成 i 和 i+n  i->i+n的容量为经过的次数  (这题为1 )

若i 能到达 j  则连接 i+n-> j

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <cmath>
using namespace std;
#include <queue>
#include <stack>
#include <vector>
#include <deque>
#include <set>
#include <map>
#include <time.h>;
#define cler(arr, val)    memset(arr, val, sizeof(arr))
#define FOR(i,a,b)  for(int i=a;i<=b;i++)
#define IN   freopen ("in.txt" , "r" , stdin);
#define OUT  freopen ("out.txt" , "w" , stdout);
typedef long long  LL;
const int MAXN = 514;
const int MAXM = 40101;
const int INF = 0x3f3f3f3f;
const int mod = 1000000007;
struct Edge
{int to,next,cap,flow;
} edge[MAXM]; //注意是MAXM
int tol;
int head[MAXN];
int gap[MAXN],dep[MAXN],cur[MAXN];
void init()
{tol = 0;memset(head,-1,sizeof (head));
}
void addedge (int u,int v,int w,int rw = 0)
{edge[tol].to = v;edge[tol].cap = w;edge[tol].flow = 0;edge[tol].next = head[u];head[u] = tol++;edge[tol].to = u;edge[tol].cap = rw;edge[tol].flow = 0;edge[tol].next = head[v];head[v] = tol++;
}
int Q[MAXN];
void BFS(int start,int end)
{memset(dep,-1,sizeof(dep));memset(gap,0,sizeof(gap));gap[0] = 1;int front = 0, rear = 0;dep[end] = 0;Q[rear++] = end;while(front != rear){int u = Q[front++];for(int i = head[u]; i !=  -1; i = edge[i].next){int v = edge[i]. to;if(dep[v] != -1)continue;Q[rear++] = v;dep[v] = dep[u] + 1;gap[dep[v]]++;}}
}
int S[MAXN];
int sap(int start,int end, int N)
{BFS(start,end);memcpy(cur,head,sizeof(head));int top = 0;int u = start;int ans = 0;int i;while(dep[start] < N){if(u == end){int Min = INF;int inser;for( i = 0; i < top; i++){if(Min > edge[S[i]].cap - edge[S[i]].flow){Min = edge[S[i]].cap - edge[S[i]].flow;inser = i;}}for( i = 0; i < top; i++){edge[S[i]]. flow += Min;edge[S[i]^1].flow -= Min;}ans += Min;top = inser;u = edge[S[top]^1].to;continue;}bool flag =  false;int v;for( i = cur[u]; i != -1; i = edge[i]. next){v = edge[i]. to;if(edge[i].cap - edge[i].flow && dep[v]+1 == dep[u]){flag =  true;cur[u] = i;break;}}if(flag){S[top++] = cur[u];u = v;continue;}int Min = N;for( i = head[u]; i !=  -1; i = edge[i].next){if(edge[i].cap - edge[i].flow && dep[edge[i].to] < Min){Min = dep[edge[i].to];cur[u] = i;}}gap[dep[u]]--;if(!gap[dep[u]]) return ans;dep[u] = Min + 1;gap[dep[u]]++;if(u != start)u = edge[S[--top]^1].to;}return ans;
}
double gao(double x,double y,double a,double b)
{return sqrt((x-a)*(x-a)+(y-b)*(y-b));
}
struct point
{double f,x,y,r;point(){};
}a[202];
bool cmp(point a,point b)
{return a.f<b.f;
}
int main()
{
#ifndef ONLINE_JUDGEfreopen("in.txt", "r", stdin);
#endifint t,n;scanf("%d",&t);while(t--){init();scanf("%d",&n);for(int i=0;i<n;i++)scanf("%lf%lf%lf%lf",&a[i].f,&a[i].x,&a[i].y,&a[i].r);sort(a,a+n,cmp);addedge(0,n,1);addedge(n-1,2*n-1,1);for(int i=0;i<n;i++){addedge(i,i+n,1);for(int j=i+1;j<n;j++){if(a[i].f<a[j].f&&gao(a[i].x,a[i].y,a[j].x,a[j].y)<(a[i].r+a[j].r))addedge(i+n,j,1);}}if(sap(0,2*n-1,2*n)==2)puts("Game is VALID");else puts("Game is NOT VALID");}return 0;
}

转载于:https://www.cnblogs.com/kewowlo/p/4088354.html

【网络流】 HDU 4183 Pahom on Water 拆点相关推荐

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

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

  2. hdu 4183 Pahom on Water 网络流

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

  3. hdu 4183 Pahom on Water 最大流

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

  4. HDU 4183 Pahom on Water(点双连通分量)

    题意:有很多的被涂上颜色的呈圆形的垫子,一些垫子可以有相同的颜色,但是红色和紫罗兰只有一个,垫子摆放的时候可以相交,初始一个人站在红垫子上,这个人要从红垫子走到紫罗兰垫子,然后再从紫罗兰垫子走到红垫子 ...

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

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

  6. HDU 4183 Pahom on Wate【网络流+路径问题】

    HDU 4183 Pahom on Water: 题意: 有n(2≤n≤300)个点,每个点有个频率f(400.0≤f≤789.0)和二维坐标还有半径.如果点i能走到点j,那么以两个点为圆心半径分别为 ...

  7. 【HDOJ】4183 Pahom on Water

    就是一个网络流.red结点容量为2,查看最大流量是否大于等于2.对于条件2,把边反向加入建图.条件1,边正向加入建图. 1 /* 4183 */ 2 #include <iostream> ...

  8. HDU 4183(max flow)

    HDU 4183(max flow) 链接 题意:orz,论翻译的重要性,看了半天.进入正题: 有n(2 <= n <= 300)个圆圈,每个圆圈都有其频率f,坐标(x,y),半径r.(题 ...

  9. 最大流 hdu 4183

    /** hdu 4183 求两点之间来回不重复的两条路就是要求从起点到终点至少有两条不重复的路径,最大流大于等于2即可 **/#include <iostream> #include &l ...

最新文章

  1. prim算法_最小生成树的本质是什么?Prim算法道破天机
  2. 霸气侧漏HTML5--之--canvas(1) api + 弹球例子
  3. 微软SQL Server数据库的两种请求游标
  4. 取值方法_我国细骨料试验方法标准分析及修订建议
  5. 【Python】利用 Python 实现多任务进程
  6. 批量打印pdf并合并_CAD批量打印攻略
  7. Javascript屏蔽鼠标的右键的两种方法。
  8. MyEclipes+html+jsp+mysql实现一个物流信息网
  9. 在linux下做源码免杀,Cobaltstrike免杀从源码级到落地思维转变
  10. [译]Ocelot - Headers Transformation
  11. opera官方教程-前台
  12. APP中如何判断手机类型
  13. 《女生宿舍第二部》(1-46上) 转贴
  14. Titantic乘客生还预测数据分析报告—基于python实现
  15. 从南极之争谈软件架构十个技巧,及…
  16. Android系统状态栏的信号图标显示流程简介
  17. MapReducer 取前五的案列Top n
  18. Appium统计iOS或者Android应用的性能
  19. 【西语】【5】Qué clase de persona eres 你是什么样的人
  20. Aura component cache clear set

热门文章

  1. 字节一面,面试官拿 System.out.println() 考了我半个小时?我傻了
  2. Spring 异步调用,一行代码实现!舒服,不接受任何反驳~
  3. 技术生涯二三事(上)
  4. 什么决定了程序员的价格,程序员该如何溢价
  5. Linux下一些实用的操作记录
  6. 图解 Hibernate,session.close(),session.clear()区别
  7. 运行js_最新双十一喵币自动领取方法,安卓手机通过js脚本完美运行
  8. 湿度传感器如何工作?
  9. 腾讯天津数据中心余热回收应用初探
  10. 数据中心、云计算、大数据之间的区别与联系