日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【bzoj 1340】 Escape逃跑问题 【Baltic2007】

發布時間:2023/12/8 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【bzoj 1340】 Escape逃跑问题 【Baltic2007】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Description

戰犯們企圖逃離監獄,他們詳細地計劃了如何逃出監獄本身,逃出監獄之后他們希望在附近的一個村子里找到掩護。村子(下圖中的B)和監獄(圖中的A)中間有一個峽谷,這個峽谷也是有士兵守衛的。守衛峽谷的士兵們坐在崗哨上很少走動,每個士兵的觀察范圍是100米。士兵所處位置決定了戰犯們能否安全通過峽谷,安全通過的條件就是在任何時刻戰犯們距離最近的士兵大于100米。 給定峽谷的長、寬和每個士兵在峽谷中的坐標,假定士兵的位置一直保持不變,請你寫一個程序計算戰犯們能否不被士兵發現,順利通過峽谷。如果不能,那么戰犯們最少需要消滅幾個士兵才能安全通過峽谷(無論士兵是否被另一個士兵看到,他都可以被消滅)。?

Input

第一行有三個整數L、W和N,分別表示峽谷的長度、寬度和士兵的人數。接下來的N行,每行兩個整數Xi和Yi,表示第i個士兵在峽谷的坐標(0 <= Xi <= L, 0 <= Yi <= W),坐標以米為單位,峽谷的西南角坐標為(0, 0),東北角坐標為(L, W),見上圖。注意:通過峽谷可以從(0, ys)(0 <= ys <= W)到(L, ye)(0 <= ye <= W),其中ys, ye不一定是整數。

Output

只有一行,為一個整數,即安全通過峽谷需要消滅的士兵的人數,如果不需要消滅任何士兵,則輸出0。

Sample Input

130 340 5
10 50
130 130
70 170
0 180
60 260

Sample Output

1

HINT

1 <= W <= 50,000 1 <= L <= 50,000 1 <= N <= 250

對于這道題,首先我們可以發現最后結果一定是一條穿過若干個類似下圖的由士兵組成的集合,所以我們考慮設置超級源點和超

級匯點,對于每一個士兵,將其拆為兩個點和,在兩個點之間連一條權值為1的邊,如果他的觀察范圍達到峽谷上端,則將與超級源連一條權值為INF的邊,如果他的觀察范圍達到峽谷下端,則將與超級匯連連一條權值為INF的邊,對于任意兩個士兵和,如果他們的觀察范圍相交,則在和之間連一條權值為INF的邊,那么最后的結果就是這張圖的最小割,下面是程序:

#include<stdio.h> #include<string.h> #include<iostream> using namespace std; const int N=200005,INF=0x7fffffff; struct queue{int l,r,a[N];void clear(){l=0,r=1;}bool empty(){return l+1==r;}void push(int x){a[r]=x;r=(r+1)%N;}void pop(){l=(l+1)%N;}int front(){return a[(l+1)%N];} }q; struct Point{int x,y; }a[N]; struct edge{int v,w,next; }e[N]; int head[N],k,d[N],s,t; int abs(int n){return n>0?n:-n; } int dis(Point a,Point b){int x=a.x-b.x,y=a.y-b.y;return x*x+y*y; } inline void add(int u,int v,int w){e[k]=(edge){v,w,head[u]};head[u]=k++;e[k]=(edge){u,0,head[v]};head[v]=k++; } bool BFS(){q.clear();memset(d,0,sizeof(d));q.push(s);d[s]=1;int i,u;while(!q.empty()){u=q.front();q.pop();for(i=head[u];i!=-1;i=e[i].next){if(!d[e[i].v]&&e[i].w){d[e[i].v]=d[u]+1;q.push(e[i].v);}}}return d[t]; } int dfs(int u,int f){if(u==t||f==0){return f;}int i,t,use=0;for(i=head[u];i!=-1;i=e[i].next){if(d[e[i].v]==d[u]+1&&(t=dfs(e[i].v,min(f-use,e[i].w))>0)){e[i].w-=t;e[i^1].w+=t;use+=t;if(use==f){return f;}}}return use; } int dinic(){int ans=0;while(BFS()){ans+=dfs(s,INF);}return ans; } int main(){int n,m,k,i,j;scanf("%d%d%d",&n,&m,&k);s=0,t=2*k+1;memset(head,-1,sizeof(head));for(i=1;i<=k;i++){scanf("%d%d",&a[i].x,&a[i].y);if(a[i].y<=100){add(s,i,INF);}if(abs(a[i].y-m)<=100){add(i+k,t,INF);}add(i,i+k,1);}for(i=1;i<=k;i++){for(j=1;j<=k;j++){if(i!=j&&dis(a[i],a[j])<=40000){add(i+k,j,INF);}}}printf("%d\n",dinic());return 0; }

?

總結

以上是生活随笔為你收集整理的【bzoj 1340】 Escape逃跑问题 【Baltic2007】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。