Uva-12264-Risk
2014-07-12 15:57
197 查看
这个题确实题意太坑了,求的是与敌人相邻的城市最多可以有多少士兵(所有的都必须大于等于这个值),然后应该就比较简单了。
代码:
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<queue> using namespace std; const int inf=1<<29; const int maxn=210; const int maxm=maxn*maxn; int st,des,e,n,head[maxn],pnt[maxm],nxt[maxm],flow[maxm],level[maxn]; int a[maxn]; char map[maxn][maxn]; queue<int> q; void AddEdge(int u,int v,int f) { pnt[e]=v;nxt[e]=head[u];flow[e]=f;head[u]=e++; pnt[e]=u;nxt[e]=head[v];flow[e]=0;head[v]=e++; } int Build(int val) { int sum=0; memset(head,-1,sizeof(head)); e=st=0;des=2*n+1; for(int i=1;i<=n;i++) { bool isborder=false; if(!a[i]) continue; AddEdge(st,i,a[i]); AddEdge(i,i+n,a[i]); for(int j=1;j<=n;j++) { if(map[i][j]=='Y') { if(!a[j]) isborder=true; else AddEdge(n+i,j,inf); //printf("Add %d %d\n",i,j); } } if(isborder) { AddEdge(i,des,val); //printf("ADDDB %d %d\n",i,des); sum+=val; } else { //printf("AdddA %d %d\n",i,des); AddEdge(i,des,1); sum+=1; } } return sum; } bool BFS() { memset(level,0,sizeof(level)); level[st]=1; q.push(st); while(!q.empty()) { int u=q.front(); q.pop(); for(int i=head[u];i!=-1;i=nxt[i]) if(flow[i]&&!level[pnt[i]]) { level[pnt[i]]=level[u]+1; q.push(pnt[i]); } } return level[des]; } int DFS(int u,int maxf) { if(u==des||!maxf) return maxf; for(int i=head[u],t;i!=-1;i=nxt[i]) if(level[pnt[i]]==level[u]+1&&(t=DFS(pnt[i],min(flow[i],maxf)))) { flow[i]-=t; flow[i^1]+=t; return t; } return level[u]=0; } int maxflow() { int ans=0; while(BFS()) while(1) { int val=DFS(st,inf); if(!val) break; ans+=val; } return ans; } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) scanf("%s",map[i]+1); int sl=0,sr=100010,ans=0; while(sl<=sr) { // printf("LRRRR %d %d\n",sl,sr); int mid=(sl+sr)>>1; int val=Build(mid); int f=maxflow(); // printf("FFFF %d %d %d\n",val,f,mid); if(f==val) { sl=mid+1; ans=mid; } else sr=mid-1; } printf("%d\n",ans); } return 0; }
相关文章推荐
- UVA - 12264 Risk (二分,网络流)
- Risk UVA - 12264
- UVa12264 Risk(最大流)
- Risk uva 12264(最大流,二分法,拆点法)
- Risk UVA - 12264 拆点法+最大流+二分 最少流量的节点流量尽量多。
- uva 12264 (Risk) 二分 + 最大流
- 网络流 UVA 12264 Risk
- UVA 12264 Risk 二分最大流
- Risk - UVa 567 Floyd
- Uva567(Risk)
- ZOJ1221 && UVA567:Risk(Floyd)
- uva 567 Risk(最短路Folyd)
- uva_risk
- UVa567_Risk(最短路)(小白书图论专题)
- UVALive 4949 Risk(二分网络流、SAP)
- uva 567 Risk
- UVA 567 - Risk
- ZOJ1221 && UVA567:Risk(Floyd)
- UVA 567 Risk
- UVA 567 Risk