11 int from
, to
, cap
, flow
;
13 vector
<s_ar
> salen
[NN
], llegan
[NN
];
14 void addEdge(int from
, int to
, int cap
, int flow
){
16 e
.from
= from
, e
.to
= to
, e
.cap
= cap
, e
.flow
= flow
;
17 salen
[from
].push_back(e
);llegan
[to
].push_back(e
);
21 bool isPath(int s
, int t
){
24 int qb
, qe
; qb
= qe
= 0;
25 memset(prev
, -1, sizeof(prev
));
26 prev
[q
[qe
++] = s
] = -2;
27 while( qb
< qe
&& prev
[t
] == -1 ){
28 for(int v
= q
[qb
++], i
=0, u
; i
<max(salen
[v
].size(), llegan
[v
].size() ); i
++){
29 if(i
< salen
[v
].size() && prev
[u
= salen
[v
][i
].to
] == -1
30 && salen
[v
][i
].flow
< salen
[v
][i
].cap
){
31 prev
[q
[qe
++] = u
] = v
, dir
[u
] = 1;;
33 if(i
<llegan
[v
].size() && prev
[u
= llegan
[v
][i
].from
] == -1
34 && llegan
[v
][i
].flow
){
35 prev
[q
[qe
++] = u
] = v
, dir
[u
] = -1;
41 int r(int u
, int v
, int d
){
43 for(int i
= 0; i
< salen
[u
].size();i
++)if( salen
[u
][i
].to
== v
44 && salen
[u
][i
].flow
< salen
[u
][i
].cap
){
45 return salen
[u
][i
].cap
-salen
[u
][i
].flow
;
48 for(int i
= 0; i
< llegan
[u
].size();i
++)if( llegan
[u
][i
].from
== v
49 && llegan
[u
][i
].flow
){
50 return llegan
[u
][i
].flow
;
54 void modify(int uu
, int vv
, int d
, int flow
){
58 for(int i
= 0; i
< salen
[u
].size();i
++)if( salen
[u
][i
].to
== v
59 && salen
[u
][i
].flow
< salen
[u
][i
].cap
){
60 salen
[u
][i
].flow
+= flow
;
64 for(int i
= 0; i
< llegan
[u
].size();i
++)if( llegan
[u
][i
].from
== v
65 && llegan
[u
][i
].flow
< llegan
[u
][i
].cap
){
66 llegan
[u
][i
].flow
+= flow
;
71 for(int i
= 0; i
< salen
[u
].size();i
++)if( salen
[u
][i
].to
== v
72 && salen
[u
][i
].flow
){
73 salen
[u
][i
].flow
+= flow
;
77 for(int i
= 0; i
< llegan
[u
].size();i
++)if( llegan
[u
][i
].from
== v
78 && llegan
[u
][i
].flow
){
79 llegan
[u
][i
].flow
-= flow
;
84 int augment(int s
, int t
){
87 for(int v
= t
, u
= prev
[v
]; v
!= u
; v
= u
, u
= prev
[v
]){
88 flow
= min(flow
, r(u
,v
,dir
[v
]));
90 for(int v
= t
, u
= prev
[v
]; v
!= u
; v
= u
, u
= prev
[v
]){
91 // if( v == t || u == s ) continue;
92 modify(u
,v
,dir
[v
], flow
);
96 int edmondsKarp(int s
,int t
){
98 while( isPath(s
,t
) ) res
+= augment(s
,t
);
105 while(scanf("%i", &N
)!=EOF
){
106 for(i
=0;i
<2*N
+4;i
++) salen
[i
].clear(), llegan
[i
].clear();
109 addEdge(i
+1, i
+1+N
,k
,0);
114 scanf("%i %i %i", &a
, &b
, &c
);
118 scanf("%i %i", &B
, &D
);
125 addEdge(N
+c
,2*N
+1,INF
,0);
127 int flow
= edmondsKarp(0,2*N
+1);
128 printf("%i\n", flow
);