BZOJ 1822 [JSOI2010]Frozen Nova 冷冻波
2017-03-25 20:28
471 查看
很明显的一道最大流,利用计算几何判断是否被攻击的关系。二分时间以判断攻击次数,每次重新建图。
#include<cstdio> #include<iostream> #include<cstring> #include<vector> #include<queue> #include<stack> #include<cmath> using namespace std; const int maxn = 10005; const int inf = 0x3f3f3f3f; struct edge { int u,v,cap,flow; }; struct P { int x,y,r,t; }; struct L{ P a,b; }; P w[maxn],s[maxn],t[maxn]; vector<int> G[maxn]; vector<edge> f; void add_edge(int u,int v,int cap) { f.push_back((edge){u,v,cap,0}); f.push_back((edge){v,u,0,0}); int m=f.size(); G[u].push_back(m-2); G[v].push_back(m-1); } int d[maxn],cur[maxn],mx,x,y,z,n,m,S,T,l,r,k; bool vis[maxn],map[505][505]; bool bfs() { memset(vis,false,sizeof(vis)); queue<int> Q; Q.push(S); vis[S]=true;d[S]=0; while(!Q.empty()) { int u=Q.front(); Q.pop(); for(int i=0;i<G[u].size();i++) { edge& e=f[G[u][i]]; if(e.cap>e.flow&&!vis[e.v]) { d[e.v]=d[u]+1; vis[e.v]=true; Q.push(e.v); } } } return vis[T]; } int dfs(int u,int a) { int flow=0,h; if(u==T||a==0) return a; for(int &i=cur[u];i<G[u].size();i++) { edge& e=f[G[u][i]]; if(d[e.v]==d[u]+1&&(h=dfs(e.v,min(e.cap-e.flow,a)))>0) { flow+=h; f[G[u][i]^1].flow-=h; e.flow+=h; a-=h; if(a==0) break; } } return flow; } int Dinic(int s,int t) { int flow=0; while(bfs()) { memset(cur,0,sizeof(cur)); flow+=dfs(s,inf); } return flow; } inline P operator-(P a,P b) { P t;t.x=a.x-b.x;t.y=a.y-b.y;return t; } inline double operator*(P a,P b) { return a.x*b.y-a.y*b.x; } inline double dis(P a,P b) { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } inline double dot(P a,P b) { return a.x*b.x+a.y*b.y; } inline double dis(L l,P p) { if(dot(l.a-p,l.b-p)>0) return min(dis(l.a,p),dis(l.b,p)); return abs((p-l.a)*(l.b-l.a)/dis(l.a,l.b)); } bool jud(int x,int y) { if(dis(w[x],s[y])>w[x].r)return 0; for(int i=1;i<=k;i++) if(dis((L){w[x],s[y]},t[i])<t[i].r)return 0; return 1; } void build(int x) { f.clear();T=n+m+1; for(int i=0;i<=T;i++) G[i].clear(); for(int i=1;i<=n;i++) add_edge(0,i,x/w[i].t+1); for(int i=1;i<=m;i++) add_edge(i+n,T,1); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) if(map[i][j]) add_edge(i,j+n,1); } int main() { scanf("%d c8d1 %d%d",&n,&m,&k); for(int i=1;i<=n;i++) scanf("%d%d%d%d",&w[i].x,&w[i].y,&w[i].r,&w[i].t),mx=max(mx,w[i].t); for(int i=1;i<=m;i++) scanf("%d%d",&s[i].x,&s[i].y); for(int i=1;i<=k;i++) scanf("%d%d%d",&t[i].x,&t[i].y,&t[i].r); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { map[i][j]=jud(i,j); if(map[i][j]) d[j]=1; } for(int i=1;i<=m;i++) { if(!d[i]){ puts("-1");return 0; } } l=0,r=mx*m;int mid; while(l<=r) { mid=(l+r)>>1; build(mid); int ans=Dinic(S,T); if(ans==m) r=mid-1; else l=mid+1; } printf("%d\n",l); return 0; }
相关文章推荐
- BZOJ 1822 JSOI 2010 Frozen Nova 冷冻波 二分+网络流
- 【BZOJ1822】【JSOI2010】Frozen Nova 冷冻波
- [JSOI2010][BZOJ1822] Frozen Nova 冷冻波
- 【bzoj1822】[JSOI2010]Frozen Nova 冷冻波 计算几何+二分+网络流最大流
- Bzoj1822:[JSOI2010]Frozen Nova 冷冻波:计算几何+网络流
- bzoj1822 [JSOI2010]Frozen Nova 冷冻波
- 【计算几何】【二分答案】【最大流】bzoj1822 [JSOI2010]Frozen Nova 冷冻波
- bzoj 1822 [JSOI2010]Frozen Nova 冷冻波
- bzoj1822 [JSOI2010]Frozen Nova 冷冻波(计算几何+二分答案+最大流)
- bzoj1822: [JSOI2010]Frozen Nova 冷冻波 计算几何:直线与圆的交点 最大流 二分答案
- 【bzoj1822】[JSOI2010] Frozen Nova 冷冻波
- 【BZOJ1822】[JSOI2010]Frozen Nova 冷冻波 几何+二分+网络流
- bzoj1822: [JSOI2010]Frozen Nova 冷冻波网络流
- bzoj1822: [JSOI2010]Frozen Nova 冷冻波
- [BZOJ]1822: [JSOI2010]Frozen Nova 冷冻波 二分+网络流
- bzoj 1822: [JSOI2010]Frozen Nova 冷冻波 题解
- [BZOJ 1822][JSOI2010]Frozen Nova 冷冻波:最大流
- Bzoj1822 [JSOI2010]Frozen Nova 冷冻波
- 1822: [JSOI2010]Frozen Nova 冷冻波 二分最大流
- bzoj1822: [JSOI2010]Frozen Nova 冷冻波