@bzoj - 3504 @ [Cqoi2014] опасный мост


@описание@

Алиса и Боб живут в сиденье государственных островов 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.

рекомендация

отwww.cnblogs.com/Tiw-Air-OAO/p/11416181.html