码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj3504: [Cqoi2014]危桥--最大流

时间:2016-05-26 22:05:28      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:

题目大意:给张无向图,有两个人a,b分别从各自的起点走向各自的终点,走A,B个来回,图里有些边只能走两次,求问是否能满足a,b的需求

按照题目给的表建图

S连a1,b1

a2,b2连T

跑最大流看是否满流

为了防止a1跑到b2的情况

第二遍

S连a1,b2

a2,b1连T

若还是满流说明没问题

 

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<algorithm>
 4 #include<queue>
 5 #define INF 0x7fffffff
 6 using namespace std;
 7 const int maxe = 5050, maxn = 55;
 8 int n,a1,a2,A,b1,b2,B;
 9 char st[1000];
10 struct node{
11     int to[maxe],next[maxe],flow[maxe];
12     int head[maxn],h[maxn],tot,s,t;
13     void init(){s=0; t=n+1; memset(head,-1,sizeof(head)); tot=-1;}
14     void insert(int u, int v, int f){
15         to[++tot]=v;
16         next[tot]=head[u];
17         flow[tot]=f;
18         head[u]=tot;
19         to[++tot]=u;
20         next[tot]=head[v];
21         flow[tot]=0;
22         head[v]=tot;
23     }
24     bool bfs(){
25         memset(h,-1,sizeof(h));
26         queue<int> Q;
27         Q.push(s);
28         h[s]=0;
29         while (!Q.empty()){
30             int now=Q.front();
31             Q.pop();
32             for (int i=head[now]; i!=-1; i=next[i]){
33                 int v=to[i];
34                 if (flow[i] && h[v]==-1){
35                     h[v]=h[now]+1;
36                     Q.push(v);
37                 }
38             }
39         }
40         if (h[t]==-1) return 0; return 1;
41     }
42     int dfs(int x, int mx){
43         if (x==t) return mx;
44         int res=0;
45         for (int i=head[x]; i!=-1; i=next[i]){
46             int v=to[i];
47             if (flow[i] && h[v]==h[x]+1){
48                 int f=dfs(v,min(flow[i],mx));
49                 flow[i]-=f; flow[i^1]+=f;
50                 res+=f; mx-=f;
51                 if (!mx) break;
52             }
53         }
54         if (!res) h[x]=-1;
55         return res;
56     }    
57     int maxflow(){
58         int ans=0;
59         while (bfs()) ans+=dfs(s,INF);
60         return ans;
61     }
62 }x,y;
63 int main(){
64     while (scanf("%d%d%d%d%d%d%d", &n, &a1, &a2, &A, &b1, &b2, &B)!=EOF){
65         a1++; a2++; b1++; b2++;
66         A*=2; B*=2; x.init();
67         for (int i=1; i<=n; i++){
68             scanf("%s", st+1);
69             for (int j=1; j<=n; j++){
70                 if (st[j]==O) x.insert(i,j,2);
71                 else if (st[j]==N) x.insert(i,j,INF);
72             }
73         }
74         y=x;
75         int s=0, t=n+1;
76         x.insert(s,a1,A); x.insert(a2,t,A); x.insert(s,b1,B); x.insert(b2,t,B);
77         y.insert(s,a1,A); y.insert(a2,t,A); y.insert(s,b2,B); y.insert(b1,t,B);
78         if (x.maxflow()==A+B && y.maxflow()==A+B) printf("Yes\n"); else printf("No\n");
79     }
80     return 0;
81 }

 

bzoj3504: [Cqoi2014]危桥--最大流

标签:

原文地址:http://www.cnblogs.com/mzl120918/p/5532774.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!