国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

第三章 圖論 No.13拓?fù)渑判?/h1>

這篇具有很好參考價(jià)值的文章主要介紹了第三章 圖論 No.13拓?fù)渑判?。希望?duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。


拓?fù)湫蚝虳AG有向無環(huán)圖聯(lián)系在一起,通常用于最短/長路的線性求解
第三章 圖論 No.13拓?fù)渑判?AcWing算法提高課 課程記錄,圖論

裸題:1191. 家譜樹

1191. 家譜樹 - AcWing題庫
第三章 圖論 No.13拓?fù)渑判?AcWing算法提高課 課程記錄,圖論

#include <iostream>
#include <cstring>
using namespace std;

const int N = 110, M = 10010;
int h[N], e[M], ne[M], idx;
int d[N], q[N], hh, tt = -1;
int n, m;

void add(int x, int y)
{
    e[idx] = y, ne[idx] = h[x], h[x] = idx ++ ;
}

void topsort()
{
    for (int i = 1; i <= n; ++ i )
        if (!d[i]) q[ ++ tt ] = i;
    while (tt >= hh )
    {
        int x = q[hh ++ ];
        for (int i = h[x]; i != -1; i = ne[i])
        {
            int y = e[i];
            if (-- d[y] == 0) q[++ tt] = y;
        }
    }
}

int main()
{
    memset(h, -1, sizeof(h));
    scanf("%d", &n);
    for (int x = 1; x <= n; ++ x )
    {
        int y;
        while (scanf("%d", &y), y)
        {
            add(x, y);
            d[y] ++ ;
        }
    }
    
    topsort();
    for (int i = 0; i <= tt; ++ i )
        printf("%d ", q[i]);
    return 0;
}

差分約束+拓?fù)渑判颍?192. 獎(jiǎng)金

1192. 獎(jiǎng)金 - AcWing題庫
第三章 圖論 No.13拓?fù)渑判?AcWing算法提高課 課程記錄,圖論

由于圖中所有邊權(quán)都是正數(shù),可以直接使用topsort求解差分約束問題
根據(jù)題意,要求一個(gè)最小值,使用最長路求解,轉(zhuǎn)化題目的條件: A > = B + 1 A >= B + 1 A>=B+1 x i > = x 0 + 100 x_i >= x_0 + 100 xi?>=x0?+100
x 0 x_0 x0?為一個(gè)虛擬源點(diǎn),向每個(gè)點(diǎn)連了一條權(quán)值為100的邊

若圖中存在環(huán),topsort的隊(duì)列長度將小于n,因?yàn)榄h(huán)的起點(diǎn)無法進(jìn)入隊(duì)列
先用topsort判斷圖中是否存在環(huán),若不存在,根據(jù)拓?fù)湫虮闅v圖,求解最長路

#include <iostream>
#include <cstring>
using namespace std;

const int N = 10010, M = 30010;
int h[N], e[M], ne[M], w[M], idx;
int q[N], d[N], hh, tt = -1;
int dis[N];
int n, m;

void add(int x, int y, int d)
{
    e[idx] = y, ne[idx] = h[x], w[idx] = d, h[x] = idx ++ ;
}

bool topsort()
{
    q[ ++ tt ] = 0;
    while (tt >= hh)
    {
        int x = q[hh ++ ];
        for (int i = h[x]; i != -1; i = ne[i] )
        {
            int y = e[i];
            if ( -- d[y] == 0) q[ ++ tt ] = y;
        }
    }
    return tt == n;
}

int main()
{
    memset(h, -1, sizeof(h));
    scanf("%d%d", &n, &m);
    for (int i = 0; i < m; ++ i )
    {
        int x, y;
        scanf("%d%d", &x, &y);
        add(y, x, 1);
        d[x] ++ ;
    }
    
    for (int i = 1; i <= n; ++ i ) add(0, i, 100), d[i] ++ ;
    if (!topsort()) puts("Poor Xed");
    else 
    {
        for (int k = 0; k <= tt; ++ k )
        {
            int x = q[k];
            for (int i = h[x]; i != -1; i = ne[i])
            {
                int y = e[i];
                dis[y] = max(dis[y], dis[x] + w[i]);
            }
        }
        int sum = 0;
        for (int i = 1; i <= n; ++ i ) sum += dis[i];
        printf("%d\n", sum);
    }
    
    return 0;
}

debug:最后的遍歷沒有按照拓?fù)湫?/p>

for (int x = 0; x <= tt; ++ x )
{
	for (int i = h[x]; i != -1; i = ne[i])
	{
		int y = e[i];
		dis[y] = max(dis[y], dis[x] + w[i]);
	}
}

集合+拓?fù)湫颍?64. 可達(dá)性統(tǒng)計(jì)

[164. 可達(dá)性統(tǒng)計(jì) - AcWing題庫](https://www.acwing.com/problem/content/description/166/
第三章 圖論 No.13拓?fù)渑判?AcWing算法提高課 課程記錄,圖論

從集合的角度思考, f ( i ) f(i) f(i)表示i這個(gè)點(diǎn)能到達(dá)的所有點(diǎn),i首先能到達(dá)自己,其次能達(dá)到 f ( j 1 ) , f ( j 2 ) , . . . , f ( j n ) f(j_1), f(j_2), ... , f(j_n) f(j1?),f(j2?),...,f(jn?),假設(shè)i與n個(gè)點(diǎn)直接相連
那么要求 f ( i ) f(i) f(i),就必須求出 f ( j 1 ) , f ( j 2 ) , . . . , f ( j n ) f(j_1), f(j_2), ... , f(j_n) f(j1?),f(j2?),...,f(jn?),即拓?fù)渑判蛑形挥趇之后的所有點(diǎn)的 f ( j ) f(j) f(j)
所以這題先拓?fù)渑判?,再根?jù)拓?fù)渑判虻哪嫘颍?span id="n5n3t3z" class="katex--inline"> f ( i ) f(i) f(i)
如何表示集合 f ( i ) f(i) f(i)?用STL的容器bitset,假設(shè)圖中有N個(gè)點(diǎn),那么bitset的長度為N,每個(gè)點(diǎn)都用一個(gè)bitset記錄其集合,1表示i能遞達(dá)這個(gè)點(diǎn),0表示不能遞達(dá)
那么 f ( i ) = f ( j 1 ) ∩ f ( j 2 ) ∩ . . . ∩ f ( j n ) f(i) = f(j_1)∩ f(j_2)∩ ...∩f(j_n) f(i)=f(j1?)f(j2?)...f(jn?)

關(guān)于bitset的使用,bitset之間支持|=運(yùn)算,count()輸出bitset中1的個(gè)數(shù)

#include <iostream>
#include <cstring>
#include <bitset>
using namespace std;

const int N = 30010, M = N;
int h[N], e[M], ne[M], idx;
int q[N], d[N], hh, tt = -1;
bitset<N> f[N];
int n, m;

void add(int x, int y)
{
    e[idx] = y, ne[idx] = h[x], h[x] = idx ++ ;
}

void topsort()
{
    for (int i = 1; i <= n; ++ i )
        if (!d[i]) q[ ++ tt ] = i;
    while (tt >= hh)
    {
        int x = q[hh ++ ];
        for (int i = h[x]; i != -1; i = ne[i])
        {
            int y = e[i];
            if ( -- d[y] == 0) q[ ++ tt ] = y;
        }
    }
}

int main()
{
    memset(h, -1, sizeof(h));
    scanf("%d%d", &n, &m);
    for (int i = 0; i < m; ++ i )
    {
        int x, y;
        scanf("%d%d", &x, &y);
        add(x, y);
        d[y] ++ ;
    }
    topsort();
    
    for (int i = tt; i >= 0; -- i )
    {
        int x = q[i];
        f[x][x] = 1;
        for (int i = h[x]; i != -1; i = ne[i])
        {
            int y = e[i];
            f[x] |= f[y];
        }
    }
    for (int i = 1; i <= n; ++ i ) printf("%d\n", f[i].count());

    return 0;
}

差分約束+拓?fù)湫颍?56. 車站分級(jí)

456. 車站分級(jí) - AcWing題庫
第三章 圖論 No.13拓?fù)渑判?AcWing算法提高課 課程記錄,圖論

分析題意:對(duì)于每一條路線,未經(jīng)過的站點(diǎn)的等級(jí)一定小于經(jīng)過的站點(diǎn)等級(jí),并且最低的站點(diǎn)等級(jí)為1級(jí)
題目要求所有等級(jí)劃分中的最少等級(jí)數(shù),用最長路求最小值。將以上條件轉(zhuǎn)換成差分約束中的兩個(gè)條件: B > = A + 1 B >= A + 1 B>=A+1, x i > = x 0 + 1 x_i >= x_0 + 1 xi?>=x0?+1
x 0 x_0 x0?為虛擬源點(diǎn),通過 x 0 x_0 x0?能到達(dá)圖中的所有點(diǎn),那么就一定能遞達(dá)所有邊

由于每條路線路都會(huì)建立n * m條邊,極端情況下可能會(huì)爆空間,所以考慮如何優(yōu)化
一條路徑中未經(jīng)過的站點(diǎn)將向經(jīng)過的站點(diǎn)連接一條權(quán)值為1的邊,一共n * m條,由于這些邊的權(quán)值相同,可以在這些邊中創(chuàng)建一個(gè)虛擬點(diǎn)v,未經(jīng)過的點(diǎn)分別向v連一條權(quán)值為0的邊,v向經(jīng)過的點(diǎn)分別連接一條權(quán)值為1的邊。這樣,從未經(jīng)過的點(diǎn)到經(jīng)過的點(diǎn)的權(quán)值和依然為1,但是需要建立的邊數(shù)為n + m,此時(shí)的邊數(shù)在極端情況下也不會(huì)爆空間

#include <iostream>
#include <cstring>
using namespace std;

const int N = 2010, M = 1e6 + 10;
int h[N], e[M], ne[M], w[M], idx;
int d[N], q[N], hh, tt = -1;
bool st[N]; int dis[N];
int n, m;

void add(int x, int y, int d)
{
    e[idx] = y, ne[idx] = h[x], w[idx] = d, h[x] = idx ++ ;
}

void topsort()
{
    for (int i = 1; i <= n + m; ++ i ) 
        if (!d[i]) q[ ++ tt ] = i;
    while (tt >= hh)
    {
        int x = q[hh ++ ];
        for (int i = h[x]; i != -1; i = ne[i])
        {
            int y = e[i];
            if (-- d[y] == 0) q[ ++ tt ] = y;
        }
    }
}

int main()
{
    memset(h, -1, sizeof(h));
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= m; ++ i )
    {
        memset(st, false, sizeof(st));
        int t, start = n, end = 0;
        scanf("%d", &t);
        while (t -- )
        {
            int x;
            scanf("%d", &x);
            st[x] = true;
            start = min(start, x), end = max(end, x);
        }
        int v = n + i;
        for (int i = start; i <= end; ++ i )
        {
            if (st[i]) add(v, i, 1), d[i] ++ ;
            else add(i, v, 0), d[v] ++ ;
        }
    }
    
    topsort();
    for (int i = 1; i <= n; ++ i ) dis[i] = 1;
    for (int i = 1; i <= tt; ++ i )
    {
        int x = q[i];
        for (int i = h[x]; i != -1; i = ne[i])
        {
            int y = e[i];
            dis[y] = max(dis[y], dis[x] + w[i]);
        }
    }
    int res = 0;
    for (int i = 1; i <= n; ++ i ) res = max(res, dis[i]);
    printf("%d\n", res);
    
    return 0;
}

debug:w[M]寫成了w[N],又是這樣,然后debug了半天,了文章來源地址http://www.zghlxwxcb.cn/news/detail-650546.html

到了這里,關(guān)于第三章 圖論 No.13拓?fù)渑判虻奈恼戮徒榻B完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 第三章 圖論 No.1單源最短路及其綜合應(yīng)用

    第三章 圖論 No.1單源最短路及其綜合應(yīng)用

    做乘法的最短路時(shí),若權(quán)值=0,只能用spfa來做,相等于加法中的負(fù)權(quán)邊 1129. 熱浪 1129. 熱浪 - AcWing題庫 單源最短路,稀疏圖,用堆優(yōu)化Dijkstra即可,就是板子套了個(gè)背景 debug:由于是無向圖,邊的數(shù)量要開兩倍。但是 w[N] 沒改,debug了很久 所以 e[M], ne[M], w[M] ,只有 h[N] ,其他

    2024年02月14日
    瀏覽(19)
  • 第三章 圖論 No.11二分圖,匈牙利算法與點(diǎn)覆蓋

    第三章 圖論 No.11二分圖,匈牙利算法與點(diǎn)覆蓋

    257. 關(guān)押罪犯 - AcWing題庫 最大最小問題,一眼二分 答案的范圍在 [ 1 , 1 e 9 ] [1, 1e9] [ 1 , 1 e 9 ] 之間,二分答案,check(mid) check:將所有權(quán)值大于mid的邊進(jìn)行二分,若能得到二分圖,返回true,否則返回false 最終將得到最優(yōu)解ans,所有大于ans的邊組成的圖為二分圖,若是圖中有邊

    2024年02月12日
    瀏覽(19)
  • 第三章 圖論 No.8最近公共祖先lca, tarjan與次小生成樹

    第三章 圖論 No.8最近公共祖先lca, tarjan與次小生成樹

    O ( m l o g n ) O(mlogn) O ( m l o g n ) ,n為節(jié)點(diǎn)數(shù)量,m為詢問次數(shù),lca是一種在線處理詢問的算法 自己也是自己的祖先 倍增: f a ( i , j ) fa(i, j) f a ( i , j ) 表示從i開始,向上走 2 j 2^j 2 j 步走到的點(diǎn) j = 0,走到父節(jié)點(diǎn) j 0,分兩步走,先走到 2 j ? 1 2^{j-1} 2 j ? 1 步再走 2 j ? 1 2^{

    2024年02月13日
    瀏覽(26)
  • 第三章 圖論 No.6負(fù)環(huán)之01分?jǐn)?shù)規(guī)劃與特殊建圖方式

    第三章 圖論 No.6負(fù)環(huán)之01分?jǐn)?shù)規(guī)劃與特殊建圖方式

    裸題:904. 蟲洞 904. 蟲洞 - AcWing題庫 這個(gè)==真的服,調(diào)半天,還有,鄰接表的大小又設(shè)置錯(cuò)了 01分?jǐn)?shù)規(guī)劃:361. 觀光奶牛 361. 觀光奶牛 - AcWing題庫 在圖論問題中,所有形如:某個(gè)部分之和除以某個(gè)部分之和最大的問題,被稱為01分?jǐn)?shù)規(guī)劃,通常使用二分解決這類問題 根據(jù)題意

    2024年02月13日
    瀏覽(19)
  • 第三章 圖論 No.9有向圖的強(qiáng)連通與半連通分量

    第三章 圖論 No.9有向圖的強(qiáng)連通與半連通分量

    連通分量是無向圖的概念,yxc說錯(cuò)了,不要被誤導(dǎo) 強(qiáng)連通分量:在一個(gè)有向圖中,對(duì)于分量中的任意兩點(diǎn)u,v,一定能從u走到v,且能從v走到u。強(qiáng)連通分量是一些點(diǎn)的集合,若加入其他點(diǎn),強(qiáng)連通分量中的任意兩點(diǎn)就不能互相遞達(dá) 半連通分量:在一個(gè)有向圖中,對(duì)于分量中

    2024年02月13日
    瀏覽(17)
  • 第三章 圖論 No.5最小生成樹之虛擬源點(diǎn),完全圖與次小生成樹

    第三章 圖論 No.5最小生成樹之虛擬源點(diǎn),完全圖與次小生成樹

    虛擬源點(diǎn):1146. 新的開始 1146. 新的開始 - AcWing題庫 與一般的最小生成樹問題不同,本題需要在建立電站的電井之間建立電網(wǎng),在兩個(gè)電站之間建立電網(wǎng)需要花費(fèi)金額,可以看成一條具有權(quán)值的邊 但是建立電網(wǎng)的前提是:其中一個(gè)電井需要建立電站,建立電站也需要費(fèi)用 已經(jīng)

    2024年02月14日
    瀏覽(24)
  • 第三章 圖論 No.3 flody之多源匯最短路,傳遞閉包,最小環(huán)與倍增

    第三章 圖論 No.3 flody之多源匯最短路,傳遞閉包,最小環(huán)與倍增

    flody的四個(gè)應(yīng)用: 多源匯最短路 傳遞閉包 找最小環(huán) 恰好經(jīng)過k條邊的最短路 倍增 多源匯最短路:1125. 牛的旅行 1125. 牛的旅行 - AcWing題庫 直徑概念:同一連通塊中,兩個(gè)距離最遠(yuǎn)的點(diǎn)之間的距離 如何求直徑?由于圖中存在著兩個(gè)連通塊,所以直接對(duì)全圖做一個(gè)flody,就能更

    2024年02月14日
    瀏覽(27)
  • 第三章 圖論 No.2單源最短路之虛擬源點(diǎn),狀壓最短路與最短路次短路條數(shù)

    第三章 圖論 No.2單源最短路之虛擬源點(diǎn),狀壓最短路與最短路次短路條數(shù)

    dp是特殊的最短路,是無環(huán)圖(拓?fù)鋱D)上的最短路問題 1137. 選擇最佳線路 1137. 選擇最佳線路 - AcWing題庫 對(duì)于每組測(cè)試數(shù)據(jù),該重置的數(shù)據(jù)要重置,我沒有重置idx,導(dǎo)致TLE 處理反向建圖,還有一種擴(kuò)展做法:虛擬源點(diǎn) 設(shè)置虛擬源點(diǎn),與每個(gè)起點(diǎn)之間連接邊權(quán)為0的邊 原問題

    2024年02月14日
    瀏覽(27)
  • 第三章 搜索與圖論(二)(最短路)

    第三章 搜索與圖論(二)(最短路)

    1、對(duì)于稠密圖,由于樸素版的dijkstra算法與邊數(shù)無關(guān)使用這種算法的復(fù)雜度較低。稀疏圖用堆優(yōu)化版的算法;單源最短路中存在負(fù)權(quán)邊用SPFA 算法通常較好;多源用floyd算法; ?難點(diǎn):如何建圖,抽象為最短路問題。 由于稠密圖用這種算法,鄰接矩陣存圖,注意把g初始化為

    2024年02月21日
    瀏覽(17)
  • 第三章 搜索與圖論(二)——最短路問題

    第三章 搜索與圖論(二)——最短路問題

    源點(diǎn)表示起點(diǎn),匯點(diǎn)表示終點(diǎn) 一些認(rèn)識(shí): m和 n 2 n^2 n 2 一個(gè)級(jí)別是稠密圖,m和n一個(gè)級(jí)別是稀疏圖 最短路問題不區(qū)分有向圖與無向圖,因?yàn)闊o向圖是一種特殊的有向圖,能解決有向圖的最短路問題,就能解決無向圖的最短路問題 起點(diǎn)確定,終點(diǎn)是除起點(diǎn)外的其他點(diǎn) 默認(rèn)n表示

    2024年02月13日
    瀏覽(36)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包