青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

網(wǎng)絡(luò)流最讓人不能忍受的不是模板,而是建模!尤其是某些題目里面需要搞一段很長的預(yù)處理才能開始寫網(wǎng)絡(luò)流……

最大閉合子圖就是其中的一種。如果要求最大閉合子圖的有向圖里面有環(huán)就很囧了,因為在某些題目里(比如NOI2009的pvz),取點是有先后順序的,因此環(huán)中的點一個也取不了(有的題則不是這樣,子圖里的點可以一次全部取來,這時對于環(huán)就有兩種方案了:要么全取,要么一個不取,此時不用管環(huán),直接進(jìn)入網(wǎng)絡(luò)流即可),不僅如此,根據(jù)閉合子圖的定義,如果一個點i可以到達(dá)一個點j(注,是“可以到達(dá)”點j,也就是從i到j(luò)有路徑),而點j屬于某個環(huán),那么點i也不能取,因此在預(yù)處理中需要把點i也刪掉。以下將屬于某個環(huán)中的點成為“環(huán)點”,將可以到達(dá)環(huán)點的點稱為“環(huán)限制點”,這兩種點在預(yù)處理中都要刪除。

本沙茶以前用的一般方法是:先求圖的傳遞閉包,找出所有的環(huán)點(能夠到達(dá)自己的點),再從每個環(huán)點開始進(jìn)行逆向遍歷(將原圖所有邊反向,再遍歷),找到所有的環(huán)限制點。該方法的時間復(fù)雜度高達(dá)O(N3),且寫起來也爆麻煩。

其實,真正用于去環(huán)的最佳方法是拓?fù)渑判颍。。?br>
首先將原圖的所有邊反向,然后進(jìn)行拓?fù)渑判颍斜闅v到的點是保留下來的點,而沒有遍歷到的點就是環(huán)點或環(huán)限制點,需要刪除。
【證明:環(huán)點顯然是不可能被遍歷到的,而在反向后的新圖中,對于一個環(huán)限制點j,必然存在一個環(huán)點i能夠到達(dá)它,而i不能被遍歷到,故j也不能被遍歷到。除了這兩種點外,其它的點的所有前趨必然也都不是環(huán)點或環(huán)限制點(否則這些點就成了環(huán)限制點),因此只要入度為0(不存在前趨)的點能夠遍歷到,這些點也能夠遍歷到,而入度為0的點顯然能遍歷到,故這些點也能被遍歷到。證畢】
由于求反向圖和拓?fù)渑判蚨伎梢栽贠(M)時間內(nèi)完成,整個去環(huán)過程的時間復(fù)雜度就是O(M)的。

下面附上NOI2009 pvz代碼:(注意,本題的第9個點是一個超級大數(shù)據(jù),最后建出來的網(wǎng)絡(luò)的邊數(shù)將會達(dá)到300000,故MAXM取150000,另外,本題必須使用Dinic,SAP會超)
#include <iostream>
#include 
<stdio.h>
#include 
<string.h>
using namespace std;
#define re(i, n) for (int i=0; i<n; i++)
#define re1(i, n) for (int i=1; i<=n; i++)
#define re2(i, l, r) for (int i=l; i<r; i++)
const int MAXN = 602, MAXM = 150000, INF = ~0U >> 2;
struct link {
    
int kk;
    link 
*next;
*ed[MAXN], *ed2[MAXN];
struct edge {
    
int a, b, f, next;
    edge () {}
    edge (
int _a, int _b, int _f): a(_a), b(_b), f(_f), next(-1) {}
} ed_[MAXM 
+ MAXM];
int n, m = 0, s, t, sc[MAXN], hd[MAXN], tl[MAXN], st[MAXN], lev[MAXN], q[MAXN], hs[MAXN], pr[MAXN], ind[MAXN], now, res = 0;
bool vst[MAXN];
void init()
{
    freopen(
"pvz.in""r", stdin);
    
int n0, m0, A[20][30], num = 1, x, y, z;
    scanf(
"%d%d"&n0, &m0);
    re(i, n0) re(j, m0) A[i][j] 
= num++;
    n 
= n0 * m0 + 2; s = 0; t = n - 1; memset(ed, 0, n << 2); memset(ed2, 0, n << 2);
    re1(i, n 
- 2) {
        scanf(
"%d%d"&sc[i], &num);
        re(j, num) {
            scanf(
"%d%d"&x, &y); z = A[x][y];
            link 
*p1 = new link; p1->kk = i; p1->next = ed[z]; ed[z] = p1;
            link 
*p2 = new link; p2->kk = z; p2->next = ed2[i]; ed2[i] = p2; ind[z]++;
        }
    }
    re(i, n0) re2(j, 
1, m0) {
        z 
= A[i][j];
        link 
*p1 = new link; p1->kk = z; p1->next = ed[z - 1]; ed[z - 1= p1;
        link 
*p2 = new link; p2->kk = z - 1; p2->next = ed2[z]; ed2[z] = p2; ind[z - 1]++;
    }
    fclose(stdin);
}
inline 
void add_edge(int a, int b, int f)
{
    ed_[m] 
= edge(a, b, f);
    
if (hd[a] != -1) tl[a] = ed_[tl[a]].next = m++else hd[a] = tl[a] = m++;
    ed_[m] 
= edge(b, a, 0);
    
if (hd[b] != -1) tl[b] = ed_[tl[b]].next = m++else hd[b] = tl[b] = m++;
}
void prepare()
{
    
int front = 0, rear = -1;
    re1(i, n 
- 2if (!ind[i]) {q[++rear] = i; vst[i] = 1;}
    
int i, j;
    
for (; front<=rear; front++) {
        i 
= q[front];
        
for (link *p=ed2[i]; p; p=p->next) {
            j 
= p->kk; ind[j]--;
            
if (!ind[j]) {vst[j] = 1; q[++rear] = j;}
        }
    }
    memset(hd, 
-1, n << 2); memset(tl, -1, n << 2);
    re1(i, n 
- 2if (vst[i]) {
        
if (sc[i] > 0) {res += sc[i]; add_edge(s, i, sc[i]);}
        
if (sc[i] < 0) add_edge(i, t, -sc[i]);
    }
    re1(i, n 
- 2if (vst[i]) for (link *p=ed[i]; p; p=p->next) {
        j 
= p->kk;
        
if (vst[j]) add_edge(i, j, INF);
    }
}
void aug()
{
    
int z = hs[t], i = t, p;
    
while (i != s) {
        hs[i] 
-= z; p = pr[i]; ed_[p].f -= z; ed_[p ^ 1].f += z; i = ed_[p].a;
        
if (!ed_[p].f) now = i;
    }
    res 
-= z;
}
bool dfs()
{
    q[
0= s; memset(vst, 0, n); vst[s] = 1; lev[s] = 0;
    
int i, j, f0;
    
for (int front=0, rear=0; front<=rear; front++) {
        i 
= q[front];
        
for (int p=hd[i]; p != -1; p=ed_[p].next) {
            j 
= ed_[p].b; f0 = ed_[p].f;
            
if (!vst[j] && f0) {vst[j] = 1; lev[j] = lev[i] + 1; q[++rear] = j;}
        }
    }
    
if (!vst[t]) return 0;
    now 
= s; hs[s] = INF; memset(vst, 0, n);
    re(i, n) st[i] 
= hd[i];
    
bool ff;
    
while (!vst[s]) {
        
if (now == t) aug();
        ff 
= 0;
        
for (int p=st[now]; p != -1; p=ed_[p].next) {
            j 
= ed_[p].b; f0 = ed_[p].f;
            
if (lev[now] + 1 == lev[j] && !vst[j] && f0) {
                st[now] 
= pr[j] = p; hs[j] = hs[now] <= f0 ? hs[now] : f0; now = j; ff = 1break;
            }
        }
        
if (!ff) {
            vst[now] 
= 1;
            
if (now != s) now = ed_[pr[now]].a;
        }
    }
    
return 1;
}
void solve()
{
    
while (dfs()) ;
}
void pri()
{
    freopen(
"pvz.out""w", stdout);
    printf(
"%d\n", res);
    fclose(stdout);
}
int main()
{
    init();
    prepare();
    solve();
    pri();
    
return 0;
}

Feedback

# re: 最大閉合子圖的預(yù)處理(去環(huán))問題  回復(fù)  更多評論   

2012-01-28 12:54 by SHUXK
我用SAP真的過了

# re: 最大閉合子圖的預(yù)處理(去環(huán))問題  回復(fù)  更多評論   

2012-02-02 18:55 by Seter
囧,top+SAP真的是可以秒殺的……

# re: 最大閉合子圖的預(yù)處理(去環(huán))問題[未登錄]  回復(fù)  更多評論   

2014-11-01 23:44 by 路人甲
2011年的文章,14年來挖個墳。什么叫“環(huán)點顯然是不可能被遍歷到的”?一點都不顯然。
在有向圖
M->A A->B B->C C->A B->N
中,ABC成環(huán),M是進(jìn)入環(huán)的節(jié)點,N是從環(huán)流出的節(jié)點。

你把這圖反序后,跟原圖拓?fù)湟恢?,環(huán)點A,B,C可以從入度為0的N點開始遍歷到。
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美第十八页| 欧美多人爱爱视频网站| 欧美伦理91i| 亚洲一级片在线看| 欧美精品一区二区三区高清aⅴ| 亚洲精品在线一区二区| 亚洲午夜精品国产| 亚洲国产精品久久久久| 国产片一区二区| 欧美精品videossex性护士| 亚洲电影第三页| 久久亚洲影音av资源网| 亚洲三级视频| 日韩视频一区二区三区| 一区二区高清在线观看| 亚洲综合日韩中文字幕v在线| 亚洲欧美一区二区视频| 欧美一区二区三区免费大片| 久久婷婷丁香| 亚洲国产精品一区在线观看不卡| 日韩午夜在线播放| 久久国产婷婷国产香蕉| 欧美日韩成人一区| 伊甸园精品99久久久久久| 极品尤物一区二区三区| 亚洲精选在线观看| 亚洲男女毛片无遮挡| 国产精品亚洲网站| 欧美日产一区二区三区在线观看| 久久久福利视频| 亚洲一区二区免费在线| 欧美亚洲一区三区| 欧美精品一区二区久久婷婷 | 久久久另类综合| 亚洲一区二区三区在线视频| 亚洲国产成人精品视频| 亚洲国产成人tv| 亚洲欧美春色| 激情综合五月天| 精品成人一区二区三区| 夜夜嗨av一区二区三区四季av | 欧美福利视频在线| 久久都是精品| 欧美激情第五页| 亚洲欧洲av一区二区三区久久| 欧美高清视频一二三区| 亚洲国产精品一区制服丝袜 | 久久久久久亚洲精品杨幂换脸| 亚洲精品视频在线观看网站 | 亚洲欧美成人综合| 国产精品美女久久久浪潮软件| 亚洲伦理在线观看| 亚洲韩日在线| 免费亚洲一区| 亚洲激情成人在线| 欧美激情第9页| 欧美高清hd18日本| 99精品国产99久久久久久福利| 亚洲二区在线视频| 欧美精品18videos性欧美| 亚洲六月丁香色婷婷综合久久| 欧美激情精品久久久久久蜜臀 | 亚洲一级黄色av| 亚洲国产精品va在看黑人| 欧美国产日韩亚洲一区| 99re66热这里只有精品3直播| 欧美国产精品劲爆| 欧美精品入口| 亚洲一二三区精品| 欧美一区二区三区婷婷月色| 国产一区再线| 亚洲大胆美女视频| 欧美日韩dvd在线观看| 亚洲一区三区视频在线观看| 久久精品国产欧美激情| 国产亚洲毛片| 久久久免费av| 欧美sm视频| 亚洲小说春色综合另类电影| 亚洲四色影视在线观看| 国产一区二区三区的电影| 免费成人黄色| 欧美日韩中文字幕精品| 欧美制服丝袜| 欧美xx69| 欧美一区亚洲二区| 葵司免费一区二区三区四区五区| 日韩视频免费观看高清完整版| 中文精品一区二区三区| 一区二区三区在线不卡| 亚洲美女毛片| 激情久久久久| 一二三区精品| 亚洲风情亚aⅴ在线发布| 亚洲最新视频在线| 尹人成人综合网| 亚洲午夜在线视频| 亚洲国产日韩欧美在线99| 亚洲午夜精品一区二区| 亚洲高清自拍| 欧美一级网站| 麻豆精品精品国产自在97香蕉| 亚洲人成网站色ww在线| 亚洲免费影视第一页| 日韩午夜中文字幕| 久久精品亚洲一区二区| 亚洲免费视频观看| 免费观看日韩av| 久久久久久久久一区二区| 欧美日韩国产天堂| 玖玖精品视频| 国产精品亚洲网站| 亚洲精品乱码视频| 精品999网站| 亚洲一区二区三区在线视频| 亚洲国产三级在线| 亚洲一区二区三区四区视频| 日韩一区二区电影网| 久久中文字幕导航| 久久九九国产精品怡红院| 国产精品成av人在线视午夜片| 国产日韩欧美电影在线观看| 亚洲人成网站在线播| 亚洲成人在线| 久久久99久久精品女同性| 久久精品国产久精国产一老狼| 欧美视频在线免费看| 亚洲精选视频免费看| 亚洲黄一区二区三区| 免费成人av| 亚洲春色另类小说| 亚洲第一中文字幕| 亚洲欧美偷拍卡通变态| 欧美三区在线视频| 一区二区三区国产在线| 亚洲一区二区三区高清| 欧美三级视频在线播放| 一区二区三区视频在线| 欧美片在线观看| 亚洲日本久久| 一区二区三区视频观看| 国产日韩在线看片| 香蕉成人伊视频在线观看| 欧美亚洲视频在线观看| 国产精品综合视频| 亚洲欧美日韩一区二区三区在线 | 国产婷婷一区二区| 午夜精品视频在线观看| 欧美在线视频免费播放| 国产一区二区精品丝袜| 欧美一区2区三区4区公司二百| 久久精品最新地址| 在线播放精品| 欧美人与性动交a欧美精品| 9国产精品视频| 欧美在线一级视频| 亚洲国产成人精品女人久久久| 你懂的国产精品| 一区二区三区.www| 久久久蜜桃精品| 一本一本大道香蕉久在线精品| 亚洲美女黄色片| 欧美在线电影| 91久久精品网| 国产精品视频专区| 久久久久亚洲综合| 亚洲免费黄色| 久久久午夜视频| 一区二区三区国产精品| 国产欧美日本一区视频| 免费日韩av片| 欧美一区二区三区免费在线看 | 亚洲人成毛片在线播放| 国产精品久久久久免费a∨大胸 | 久久久综合网| 99综合在线| 国内精品久久久久久| 欧美精品三级日韩久久| 久久se精品一区精品二区| 欧美激情片在线观看| 先锋影音国产精品| 99re热这里只有精品视频| 国产精品久久久久一区二区三区共 | 亚欧美中日韩视频| 亚洲毛片视频| 欧美+亚洲+精品+三区| 亚洲一区二区三区精品在线观看| 精品福利免费观看| 国产欧美一区二区三区沐欲| 欧美电影在线播放| 香蕉乱码成人久久天堂爱免费 | 欧美日韩国产色综合一二三四| 欧美呦呦网站| 亚洲一区视频在线| 亚洲精品在线一区二区| 欧美电影免费观看高清| 久久久久看片| 日韩午夜黄色| 欧美电影在线观看完整版| 午夜精品久久久久久久男人的天堂|