YBTOJ危桥通行洛谷P3163:危桥通行(网络流)
生活随笔
收集整理的這篇文章主要介紹了
YBTOJ危桥通行洛谷P3163:危桥通行(网络流)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 題目描述
- 解析
- 代碼
題目描述
Alice 和 Bob 居住在一個由 NN 座島嶼組成的國家,島嶼被編號為 00 到 N-1N?1。某些島嶼之間有橋相連,橋上的道路是雙向的,但一次只能供一人通行。其中一些橋由于年久失修成為危橋,最多只能通行兩次。
Alice 希望在島嶼 a1和 a2 之間往返 an次(從 a1 到 a2再從 a2 到 a1 算一次往返)。同時,Bob 希望在島嶼 b1和 b2之間往返 bn次。這個過程中,所有危橋最多通行兩次,其余的橋可以無限次通行。請問 Alice 和 Bob 能完成他們的愿望嗎?
解析
首先可以把往返看成單程,危橋當成只能通過1次
建圖方法和顯然,但是會忽略a1流向b2、b1流向a2的問題
一個很巧妙的解決辦法是交換b1和b2,再跑一次,如果還是滿流,就是合法的
代碼
#include<bits/stdc++.h> #define ll long long using namespace std; const int N=2600; const int M=1e9; ll read(){ll x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-') f=-1;c=getchar();};while(isdigit(c)){x=x*10+c-'0';c=getchar();}return x*f; } int n,m,s,t; struct node{int to,nxt;ll cap; }p[N*N*2]; int fi[N],cnt; void addline(int x,int y,ll cap){ // printf("x=%d y=%d cap=%lld\n",x,y,cap);p[++cnt]=(node){y,fi[x],cap};fi[x]=cnt;p[++cnt]=(node){x,fi[y],0};fi[y]=cnt; } int bel[N],cur[N]; queue<int>q; int bfs(){memset(bel,0,sizeof(bel));bel[s]=1;q.push(s);while(!q.empty()){int now=q.front();q.pop();//printf("now=%d\n",now);for(int i=cur[now]=fi[now];~i;i=p[i].nxt){int to=p[i].to;//printf(" to=%d\n",to);if(bel[to]||!p[i].cap) continue;//printf(" ok\n");bel[to]=bel[now]+1;q.push(to);}}return bel[t]; } ll dfs(int x,ll lim){if(x==t||!lim) return lim;ll res=0;for(int &i=cur[x];~i&&lim;i=p[i].nxt){int to=p[i].to;if(!p[i].cap||bel[to]!=bel[x]+1) continue;ll add=dfs(to,min(lim,p[i].cap));res+=add;lim-=add;p[i].cap-=add;p[i^1].cap+=add;if(!lim) break;}if(!res) bel[x]=-1;return res; } ll dinic(){ll tot=0;while(bfs()){//printf("ok");while(ll tmp=dfs(s,2e15)) tot+=tmp;} // printf("tot=%lld\n",tot);return tot; } int a1,a2,an,b1,b2,bn; char ss[60][60]; void build(){char c;memset(fi,-1,sizeof(fi));cnt=-1;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){c=ss[i][j];if(c=='X') continue;else if(c=='N') addline(i,j,2e18);else addline(i,j,1);}} } int main(){while(scanf("%d%d%d%d%d%d%d",&n,&a1,&a2,&an,&b1,&b2,&bn)!=EOF){a1++;a2++;b1++;b2++;for(int i=1;i<=n;i++){scanf(" %s",ss[i]+1);}s=n+1;t=n+2;build();addline(s,a1,an);addline(a2,t,an);addline(s,b1,bn);addline(b2,t,bn);if(dinic()!=an+bn){printf("No\n");continue;}build();addline(s,a1,an);addline(a2,t,an);addline(s,b2,bn);addline(b1,t,bn);if(dinic()!=an+bn) printf("No\n");else printf("Yes\n");}return 0; } /**/總結
以上是生活随笔為你收集整理的YBTOJ危桥通行洛谷P3163:危桥通行(网络流)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 乖乖猪世界3攻略
- 下一篇: YBTOJ:矛盾指数(网络流-最大权闭合