@описание@
Алиса и Боб живут в сиденье государственных островов N, острова пронумерованы от 0 до N-1. Есть несколько островов, соединенных между мостом и автодорожным мостом в обоих направлениях, но только один человек, чтобы пройти. Некоторые из моста из-за ветхости стать опасным мостом, вы можете передавать только дважды. Алиса хочет и с острова в два раза между ал и а2 (еще раз отсчитать назад и вперед от ал к а2 из а2 ал). Между тем, Боб Хоуп млрд раза вперед и назад между островами бли и b2. Этот процесс, все наиболее опасными транспортный мост дважды, остальная часть моста неограниченного доступа. Будут ли Алиса и Боб, чтобы завершить свои желания?
Входной
этот вопрос несколько наборов тестовых данных.
Первая строка каждого набора содержит семь пространств , разделенные целые числа, соответственно, N, Al, A2, An, бли, b2, млрд.
Далее является симметричной матрицей N строк и N столбцов, заглавных букв. Я строк и J столбец числа матрицы я описывают связи между островами JL-1 и, если это «O» , указывает на то, что существует опасность моста подключен: как «N» , представляет собой обычный мост , соединенный: как «X» указывает на отсутствие моста подключен.
Выход
Для каждого набора выходной линии тестовых данных, если они хотят , чтобы быть в состоянии выполнить выход «Да», в противном случае «Нет».
Пример ввода
4 0 1 1 2 3 1
XOXX
OXOX
XOXO
XXOX
4 0 2 1 1 3 2
XNXO
NXOX
XOXO
OXOX
Пример вывода
Да
Нет
Диапазон данных
. 4 <= N <50
О <= А1, А2, В1, В2 <-N =. 1
. 1 <= а. B <= 50
@решение@
[Bzoj название лица. , , Я не какой-нибудь хороший Tucao. , , ]
Начиная поклоняться подробностями начальников блог, соответствующих доказательств в подробностях ОРЗ .
Этот вопрос на самом деле матч между раковиной и источником нескольких источниками несколько раковиной максимального потока фиксированным.
Может быть относительно легко придумать такую идею: построить супер источник подключен a1, b1, то a2, b2 и даже опуститься на супер мощности были установлены 2 AN 2 и BN, способность к опасному мосту 2, нормальный мост емкость устанавливаются в РСМД, как и двухсторонней сторона.
После такой максимальный поток построена фиги перспектива, если максимальный поток = 2 * (ап + Ьп) разрешим.
Поскольку все ребра мощности всех четных чисел (инф может быть использованы в качестве четного числа), так что вы можете поместить всю емкость разделена на два , чтобы определить максимальный поток равно к + Ьпу (т.е. Интернет сказал , просто нужно рассматривать как единый редиректа).
Но он может быть найден , если a1 -> b2 и b1 -> a2, максимальный поток выбежал из «разрешимости» не обязательно на самом деле решаемой.
Другой номер точки, чтобы ограничить опасный мост назад и вперед сложить <= 1, но мы строим из карты соответствует положительному направлению и в противоположном направлении , соответственно <= 1.
Нам нужно только источника сек подсоединенного a1, b2, а2, b1 и даже утонуть т, максимальный пробег потока снова, оно может быть определено или не законны.
Что касается доказательства. , , Все сказанное выше эссе блог очень хорошо говоритТак что я просто придерживаться вокруг,
Если полный поток и есть еще проблема , что происходит потом? Нарисуйте карту.
Первый запуск предполагается , что максимальный расход, скорость потока а1 → В2 х, то поток b1 , b2 → Ьп-х, а также течь b1 → а2 х, а1 → а2 поток является-х.
Запуск во время второго максимального потока, потому что нет, a1 → b2 → b1 и a2 потока может изменить вид или-X, Bn-х. Так a1 → b1 и b2 → a2 потока (Примечание: оригинальный блоггер это место неправильно, в разделе комментариев ниже упоминается) также по- прежнему х.
И эти два показывает , что, может течь a1 b1 х трафика может также протекать b2 х поток , не затрагивая трафик между a1 и a2, b1 и b2.
Потому что неориентированный граф, обратная скорость потока a1 → b1, скорость потока может быть получена в b1 , b2 → х. b1, b2 будет течь между законными. Аналогично а1, а2 может протекать между законным.
Так что, если обменный b1, b2 еще полный поток, конечно , не проблема , которая существует ситуация.
В течение двух проблем, если а1 → а2 после того, как опасный мост вперед, назад и b1 → b2 после моста, своп В1, В2, В2 находится в начальной точке, a1 → A2, B2 → b1 два пути является вперед через этот край, он был ограничен трафиком.
Так , если до сих пор полного потока, нет никаких сомнений в два.
@accepted код @
#include<cstdio>
#include<queue>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 50;
const int MAXV = MAXN;
const int MAXE = 2*MAXV*MAXV;
const int INF = int(1E6);
struct FlowGraph{
struct edge{
int to, cap, flow;
edge *nxt, *rev;
}edges[MAXE + 5], *adj[MAXV + 5], *cur[MAXV + 5], *ecnt;
int s, t, n;
void clear(int _n) {
n = _n; ecnt = &edges[0];
for(int i=0;i<=n;i++)
adj[i] = NULL;
}
void addedge(int u, int v, int c) {
edge *p = (++ecnt), *q = (++ecnt);
p->to = v, p->cap = c, p->flow = 0;
p->nxt = adj[u], adj[u] = p;
q->to = u, q->cap = 0, q->flow = 0;
q->nxt = adj[v], adj[v] = q;
p->rev = q, q->rev = p;
// printf("%d %d %lld\n", u, v, c);
}
queue<int>que; int d[MAXV + 5];
bool relabel() {
for(int i=0;i<=n;i++)
cur[i] = adj[i], d[i] = n + 5;
while( !que.empty() ) que.pop();
d[t] = 0, que.push(t);
while( !que.empty() ) {
int f = que.front(); que.pop();
for(edge *p=adj[f];p;p=p->nxt)
if( d[f] + 1 < d[p->to] && p->rev->cap > p->rev->flow ) {
d[p->to] = d[f] + 1;
que.push(p->to);
if( p->to == s ) return true;
}
}
return !(d[s] == n + 5);
}
int aug(int x, int tot) {
if( x == t ) return tot;
int sum = 0;
for(edge *&p=cur[x];p;p=p->nxt) {
if( p->cap > p->flow && d[p->to] + 1 == d[x] ) {
int del = aug(p->to, min(p->cap - p->flow, tot - sum));
p->flow += del, p->rev->flow -= del, sum += del;
if( sum == tot ) break;
}
}
return sum;
}
int max_flow(int _s, int _t) {
s = _s, t = _t; int flow = 0;
while( relabel() )
flow += aug(s, INF);
return flow;
}
}G;
int N, a1, a2, an, b1, b2, bn;
char str[MAXN + 5][MAXN + 5];
int main() {
while( scanf("%d%d%d%d%d%d%d", &N, &a1, &a2, &an, &b1, &b2, &bn) == 7 ) {
bool flag = true;
for(int i=0;i<N;i++)
scanf("%s", str[i]);
G.s = N, G.t = N + 1;
G.clear(N + 2);
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
if( str[i][j] == 'O' ) G.addedge(i, j, 1);
else if( str[i][j] == 'N' ) G.addedge(i, j, INF);
G.addedge(G.s, a1, an), G.addedge(G.s, b1, bn);
G.addedge(a2, G.t, an), G.addedge(b2, G.t, bn);
flag &= (G.max_flow(G.s, G.t) == an + bn);
G.s = N, G.t = N + 1;
G.clear(N + 2);
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
if( str[i][j] == 'O' ) G.addedge(i, j, 1);
else if( str[i][j] == 'N' ) G.addedge(i, j, INF);
G.addedge(G.s, a1, an), G.addedge(G.s, b2, bn);
G.addedge(a2, G.t, an), G.addedge(b1, G.t, bn);
flag &= (G.max_flow(G.s, G.t) == an + bn);
if( flag ) puts("Yes");
else puts("No");
}
}
@подробности@
Я слышал, что несколько источников нескольких моек и тону стационарные источники только проблему с линейным решением программирования.Этот вопрос, вероятно, потому что это очень специальная (2 источника 2 раковины).
Этот вывод всегда чувствовал себя очень титул богов, поле не то, что мы, простые смертные могут связаться.
Я слышал, переехал из названия TopCoder.