题意为给定一个矩形,矩形中有一些点,要使一个半径为 r 的圆穿过这个矩形而不经过这些点,至少得去掉这些点的几个点。 将上边界看成源,下边界看成汇,点到源距离小于直径,则边一条无穷大边,同样,点到下边界距离小于直径,连一条无穷大边,将点拆成两点,权值为 cost, 对任意两点,距离小于直径则连无穷边,问题就转化成求新图的最小割。
具体建图见代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
int const N= 250, inf= 0x7fffffff;
#define min(a,b) ( (a)<(b)?(a):(b) )
int w, l, r, n;
int idx= -1, S, T;
int X[N], Y[N], C[N];
struct Edge{
int wt, v;
Edge* next;
}tb[N*N];
Edge* mat[N];
int h[N], que[N];
double distance( double x1, double y1, double x2, double y2 ){
return sqrt( (x1-x2)* (x1-x2)+ (y1-y2)* (y1-y2) );
}
void inline add( int u, int v, int x ){
idx++;
tb[idx].wt= x; tb[idx].v= v;
tb[idx].next= mat[u]; mat[u]= tb+ idx;
idx++;
tb[idx].wt= 0; tb[idx].v= u;
tb[idx].next= mat[v]; mat[v]= tb+ idx;
}
inline Edge* reserve( Edge* p ){
return tb+ ((p-tb)^1);
}
int bfs(){
int head= 0, tail= 0;
for( int i= 0; i<= T; ++i ) h[i]= -1;
que[0]= S; h[S]= 0;
while( head<= tail ){
int u= que[head++];
for( Edge* p= mat[u]; p; p= p->next ){
int v= p->v, w= p->wt;
if( h[v]== -1 && w> 0 ){
h[v]= h[u]+ 1; que[++tail]= v;
}
}
}
return h[T]!= -1;
}
int dfs( int u, int flow ){
if( u== T ) return flow;
int tf= 0, f;
for( Edge* p= mat[u]; p; p= p->next ){
int v= p->v, w= p->wt;
if( h[v]== h[u]+ 1 && w> 0 && tf< flow && ( f= dfs( v, min( w, flow- tf ) ) ) ){
p->wt-= f;
reserve(p)->wt+= f;
tf+= f;
}
}
if( tf== 0 ) h[u]= -1;
return tf;
}
int main(){
int test;
scanf("%d",&test );
for( int te= 1; te<= test; ++te ){
scanf("%d%d%d%d", &w, &l, &r, &n );
S= 0; T= 2* n+ 1; idx= -1; r*= 2;
for( int i= 0; i<= T; ++i ) mat[i]= 0;
if( w< r ) add( S, T, inf );
int x, y, c;
for( int i= 1; i<= n; ++i ){
scanf("%d%d%d", X+ i, Y+ i, C+ i );
if( w- Y[i]< r )add( S, i, inf );
if( Y[i]< r ) add( i+ n, T, inf );
add( i, i+ n, C[i] );
}
for( int i= 1; i<= n; ++i )
for( int j= 1; j<= n; ++j )
if( i!= j && distance( X[i], Y[i], X[j], Y[j] )< r )
add( i+ n, j, inf );
int ans= 0;
while( bfs() ) ans+= dfs( S, inf );
if( ans== inf ) puts("-1");
else printf("%d\n", ans );
}
return 0;
}
分享到:
相关推荐
xtu湘潭大学 网络编程 tcp udp 代码源码 填空题 代码题
英特尔超频软件(XTU)CPU超频使用
Intel XTU极限超频工具
英特尔 XTU是一款基于 Windows 的性能调优软件,使新手和经验丰富的发烧友能够对系统进行超频、监视和压力等。软件接口提供了大多数发烧友平台上常见的一组强大功能,以及新的英特尔应用处理器和英特尔主板上可用的...
xtu Java的期末考试的题目 有需要的可以下载看看 也可以选择其中几道题去做
Windows 性能微调应用程序,供新手和经验丰富的发烧友对英特尔 CPU 进行超频、监视和加压等操作。
这里面给出了2015级的命中知识点、以及我们这一届复习所搜整的知识点大汇聚。 ----XTU《网络协议分析及编程》复习搜整
Intel® 酷睿™ 處理器家族。 Intel extreme tuning Utility 是簡單的 Windows * 為基礎的效能調整軟體超頻、 監控並增強系統強度,無論是新手或有經驗的高手。軟體介面提供了一套大多數愛好者平台,提供全新的 ...
直接下载,方便快捷
英特尔CPU超频工具,工功能强大的软件超频程序。使用需要注意。
这门课的老师很佛系,期末考试的内容全是卷子上的原题,把卷子做好了就行了
因为实验很多,所以老师分了单双号做的实验,我抽到的是双号,所以单号的我没做,不过我这里有单双号都要做的代码。 实验报告我也只选择了其中的5个写的,老师说的自己随便选5个报告写。
eXtreme Talent University(XTU)需要为他们的校名打印一些特别的图形,为了美观,他们选择了方阵。现在他们需要你的帮助,帮 他把这些方阵打印出来。如果方阵一边只由一个XTU的校名组成,则方阵为: XTU XTU XTU
XTU数字图像处理期末考试复习.md
湘潭大学编译原理实验报告
Xtu是用于使用xtUML方法实施平台特定模型(PSM)的支持框架。 xtUML是针对软件和硬件开发的基于模型的系统工程(MBSE)的一种形式化方法。 Xtu实现了xtUML元素“域”,“网桥”,“信号”,“类”,“状态”,“事件...
湘潭大学OJ系统 前言 关于合理的逻辑:湘潭大学OJ系统是基于vue2.0的vue-cli脚手架应用。应用所需要的到用的功能会试图包装为组件,保证在需要的时候能够更加方便的补充。 关于变量名:该应用的数据变量名,方法名...
人工智能学习总结成果,希望可以帮到大家,有疑问欢迎随时沟通~ 人工智能学习总结成果,希望可以帮到大家,有疑问欢迎随时沟通~ 人工智能学习总结成果,希望可以帮到大家,有疑问欢迎随时沟通~ ...
java中关于多媒体程序设计的参考资料 很详细 讲解清晰
Java中GUI的描述 写的很清晰,很详细 并且提供的大量的参考代码