標籤:inf 平面 log clu 正數 lin 投資 getc bfs
【BZOJ5037】[Jsoi2014]電信網路DescriptionJYY建立的電信公司,壟斷著整個JSOI王國的電信網路。JYY在JSOI王國裡建造了很多的通訊基站。目前所有的基站都是使用2G網路系統的。而現在3G時代已經到來了,JYY在思考,要不要把一些基站升級成3G網路的呢?JSOI王國可以被看作為一個無窮大的二維平面,JYY一共建造了N個通訊基站,第i個基站的座標是(Xi,Yi)。每個基站有一個通訊範圍Ri。第i號基站會向所有到其距離不超過Ri的基站發送資訊。每個基站升級到3G網路都會有一個收益Si,這個收益可能是正數(比如基站附近有個大城市,使用者很多,賺的流量費也就很多了),也可能是負數(比如基站周圍市場不佳,收益不能填補升級基站本身的投資)。此外,由於原有的使用2G網路系統的基站無法解析從升級成3G網路系統的基站所發來的資訊(但是升級之後的基站是可以解析未升級基站發來的資訊的),所以,JYY必須使得,在升級工作全部完成之後,所有使用3G網路的基站,其通訊範圍內的基站,也都是使用3G網路的。由於基站數量很多,你可以協助JYY計算一下,他通過升級基站,最多能獲得的收益是多少嗎?Input第一行一個整數N;接下來N行,每行4個整數,Xi,Yi,Ri,Si,表示處在(Xi,Yi)的基站的通訊範圍是Ri,升級可以獲得的收益是Si。資料滿足任意兩個基站的座標不同。1≤N≤500,1≤Ri≤20000,|Xi|,|Yi|,|Si|≤10^4。Output
輸出一行一個整數,表示可以獲得的最大收益。
Sample Input5
0 1 7 10
0 -1 7 10
5 0 1 -15
10 0 6 10
15 1 2 -20Sample Output5
【範例說明】
我們可以將前三座基站升級成 3G 網路,以獲得最佳收益。
題解:顯然是一個最大權閉合圖的模型,直接上建圖方法:
1.S->所有正權的點 容量:該點權權值
2.所有負權的點->T 容量:該點權值相反數
3.點>所有它能發射到的點 容量:inf
#include <cstdio>#include <iostream>#include <cstring>#include <queue>using namespace std;int n,cnt,ans,S,T;int x[510],y[510],r[510],s[510];int to[1000000],next[1000000],val[1000000],head[510],d[510];queue<int> q;inline int rd(){int ret=0,f=1;char gc=getchar();while(gc<‘0‘||gc>‘9‘){if(gc==‘-‘)f=-f;gc=getchar();}while(gc>=‘0‘&&gc<=‘9‘)ret=ret*10+gc-‘0‘,gc=getchar();return ret*f;}void add(int a,int b,int c){to[cnt]=b,val[cnt]=c,next[cnt]=head[a],head[a]=cnt++;to[cnt]=a,val[cnt]=0,next[cnt]=head[b],head[b]=cnt++;}int dfs(int x,int mf){if(x==T)return mf;int i,k,temp=mf;for(i=head[x];i!=-1;i=next[i]){if(d[to[i]]==d[x]+1&&val[i]){k=dfs(to[i],min(val[i],temp));if(!k)d[to[i]]=0;val[i]-=k,val[i^1]+=k,temp-=k;if(!temp)break;}}return mf-temp;}int bfs(){while(!q.empty())q.pop();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=next[i]){if(!d[to[i]]&&val[i]){d[to[i]]=d[u]+1;if(to[i]==T)return 1;q.push(to[i]);}}}return 0;}int main(){n=rd(),S=0,T=n+1;int i,j;memset(head,-1,sizeof(head));for(i=1;i<=n;i++){x[i]=rd(),y[i]=rd(),r[i]=rd(),s[i]=rd();if(s[i]>0)ans+=s[i],add(S,i,s[i]);elseadd(i,T,-s[i]);}for(i=1;i<=n;i++){for(j=1;j<=n;j++)if(i!=j&&(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])<=r[i]*r[i])add(i,j,1<<30);}while(bfs())ans-=dfs(S,1<<30);printf("%d",ans);return 0;}
【BZOJ5037】[Jsoi2014]電信網路 最大權閉合圖