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

第三章 圖論 No.10無(wú)向圖的雙連通分量

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

定義

無(wú)向圖有兩種雙連通分量

  1. 邊雙連通分量,e-DCC
  2. 點(diǎn)雙連通分量,v-DCC

橋:刪除這條無(wú)向邊后,圖變得不連通,這條邊被稱為橋
邊雙連通分量:極大的不含有橋的連通區(qū)域,說(shuō)明無(wú)論刪除e-DCC中的哪條邊,e-DCC依舊連通 (該連通分量的任意邊屬于原圖中的某條環(huán))。此外,任意兩點(diǎn)之間一定包含兩條不相交(無(wú)公共邊)的路徑

割點(diǎn):刪除該點(diǎn)(與該點(diǎn)相關(guān)的邊)后,圖變得不連通,這個(gè)點(diǎn)被稱為割點(diǎn)
點(diǎn)雙連通分量:極大的不含有割點(diǎn)的連通區(qū)域

一些性質(zhì):

  1. 每個(gè)割點(diǎn)至少屬于兩個(gè)連通分量
  2. 任何兩個(gè)割點(diǎn)之間的邊不一定是橋,任何橋兩邊的端點(diǎn)不一定是割點(diǎn),兩者沒(méi)有必然聯(lián)系,一個(gè)點(diǎn)連通分量也不一定是邊連通分量

第三章 圖論 No.10無(wú)向圖的雙連通分量,AcWing算法提高課 課程記錄,圖論,算法

第三章 圖論 No.10無(wú)向圖的雙連通分量,AcWing算法提高課 課程記錄,圖論,算法


Tarjan求e-DCC

無(wú)向圖不存在橫叉邊
和有向圖的強(qiáng)連通分量類似,引入dfn和low兩個(gè)數(shù)組
如何找到橋?判斷x->y的y是否能走到x之前(祖先節(jié)點(diǎn)),如果能走到,x和y在一個(gè)環(huán)中,刪除這條邊,其他點(diǎn)依然是連通的
所以x->y為橋:dfn[x] < low[y]

如何找到所有邊的雙連通分量?

  1. 刪除所有橋
  2. 或者用stk輔助,若dfn[x] == low[x],說(shuō)明x出發(fā)一定走不到x的祖先節(jié)點(diǎn),那么x和其父節(jié)點(diǎn)之間的邊是橋,此時(shí)還在stk中的點(diǎn)為e-DCC的節(jié)點(diǎn)

這里使用第二種方式,模板:

void tarjan(int x, int from)
{
    dfn[x] = low[x] = ++ tp;
    stk[ ++ tt] = x;
    for (int i = h[x]; i != -1; i = ne[i])
    {
        int y = e[i];
        if (!dfn[y])
        {
            tarjan(y, i);
            low[x] = min(low[x], low[y]);
        }
        else if (i != (from ^ 1))
            low[x] = min(low[x], dfn[y]);
        if (dfn[x] < low[y])
                st[i] = st[i ^ 1] = true;
    }
    if (dfn[x] == low[x])
    {
        int y;
        cnt ++ ;
        do {
            y = stk[tt -- ];
            id[y] = cnt;
        } while (x != y);
    }
}

由于無(wú)向圖要存儲(chǔ)兩條有向邊,并且從數(shù)組的0下標(biāo)開(kāi)始存儲(chǔ),所以0,1、2,3…這樣一對(duì)的邊是互相反向的邊,即i和i ^ 1為反向邊
為什么與有向圖的強(qiáng)連通分量不同,邊雙連通分量不需要使用st數(shù)組以標(biāo)記棧中的元素?
因?yàn)闊o(wú)向圖不存在橫叉邊的概念,就不會(huì)出現(xiàn):x->y而y的dfn小于x,因?yàn)樵跓o(wú)向圖中y一定會(huì)向x遍歷


Tarjan求v-DCC

如何求割點(diǎn)?low[y] >= dfn[x],刪除x節(jié)點(diǎn)后,y就是一顆獨(dú)立的子樹(shù)

  1. 如果x不是根節(jié)點(diǎn),那么x是一個(gè)割點(diǎn)
  2. 如果x是根節(jié)點(diǎn),至少有兩個(gè)y滿足以上關(guān)系

求割點(diǎn)的板子:

void tarjan(int x)
{
    dfn[x] = low[x] = ++ tp;
    int t = 0;
    for (int i = h[x]; i != -1; i = ne[i])
    {
        int y = e[i];
        if (!dfn[y])
        {
            tarjan(y);
            low[x] = min(low[x], low[y]);
            if (low[y] >= dfn[x]) t ++ ;
        }
        else low[x] = min(low[x], dfn[y]);
    }
    
    if (x != root) t ++ ;
    ans = max(ans, t);
}

將每個(gè)v-DCC向其包含的割點(diǎn)連一條邊
縮點(diǎn)后,邊的數(shù)量不會(huì)增加,點(diǎn)的數(shù)量可能會(huì)增加到兩倍
第三章 圖論 No.10無(wú)向圖的雙連通分量,AcWing算法提高課 課程記錄,圖論,算法

tarjan求v-DCC與割點(diǎn)的板子:
一個(gè)孤立的點(diǎn)也是一個(gè)v-DCC,這里需要特判
若滿足條件:low[y] >= dfn[x],那么y的子樹(shù)與x一起就是一個(gè)v-DCC
對(duì)于該節(jié)點(diǎn)是否是割點(diǎn)還需要特判,若該節(jié)點(diǎn)為根,并且與該節(jié)點(diǎn)相連的連通塊數(shù)量為1,那么該節(jié)點(diǎn)就不是一個(gè)割點(diǎn)

void tarjan(int x)
{
	dfn[x] = low[x] = ++ tp;
	stk[ ++ tt ] = x;

	if (x == root && h[x] == -1)
	{
		++ dcnt;
		dcc[dcnt].push_back(x);
		return;
	}
	int t = 0; // 與x相連的連通塊數(shù)量
	for (int i = h[x]; i != -1; i = ne[i])
	{
		int y = e[i];
		if (!dfn[y])
		{
			tarjan(y);
			low[x] = min(low[x], low[y]);
			if (low[y] >= dfn[x])
			{
				dcnt ++, t ++ ;
				if (x != root || t > 1) st[x] = true; // x為割點(diǎn)
				int u;
				do {
					u = stk[tt -- ];
					dcc[dcnt].push_back(u);
				} while (u != y);
				dcc[dcnt].push_back(x);
			}
		}
		else low[x] = min(low[x], dfn[y]);
	}
}

395. 冗余路徑

395. 冗余路徑 - AcWing題庫(kù)
第三章 圖論 No.10無(wú)向圖的雙連通分量,AcWing算法提高課 課程記錄,圖論,算法

任意兩點(diǎn)間都存在兩條沒(méi)有重復(fù)邊的路徑,等價(jià)于整個(gè)圖是一個(gè)雙連通分量

將無(wú)向連通圖的邊雙連通分量縮點(diǎn)后,得到的結(jié)構(gòu)是一顆樹(shù),因?yàn)檫呺p連通分量是不包含橋的結(jié)構(gòu),縮點(diǎn)后,圖中只含有橋,即刪除任意一條邊后,圖成為兩個(gè)連通塊,這是一個(gè)樹(shù)結(jié)構(gòu)

為了滿足題意,需要向這顆樹(shù)中添加邊,使之成為邊連通分量,那么要加幾條邊?
第三章 圖論 No.10無(wú)向圖的雙連通分量,AcWing算法提高課 課程記錄,圖論,算法

連接所有葉子節(jié)點(diǎn),使這顆樹(shù)結(jié)構(gòu)成為雙連通分量,至少需要加 [ ( c n t + 1 ) / 2 ] [(cnt + 1) / 2] [(cnt+1)/2]然后再下取整的邊數(shù),也就是將每個(gè)葉子節(jié)點(diǎn)相連,使環(huán)滿足雙連通分量的性質(zhì)

注意cnt為1時(shí)需要特判

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

const int N = 5010, M = 10010;
int h[N], e[M], ne[M], idx;
int dfn[N], low[N], tp, cnt;
int stk[N], tt, id[N];
bool st[N]; int d[N];
int n, m;

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

void tarjan(int x, int from)
{
    dfn[x] = low[x] = ++ tp;
    stk[ ++ tt] = x;
    for (int i = h[x]; i != -1; i = ne[i])
    {
        int y = e[i];
        if (!dfn[y])
        {
            tarjan(y, i);
            low[x] = min(low[x], low[y]);
            if (dfn[x] < low[y])
                st[i] = st[i ^ 1] = true;
        }
        else if (i != (from ^ 1))
            low[x] = min(low[x], dfn[y]);
    }
    if (dfn[x] == low[x])
    {
        int y;
        cnt ++ ;
        do {
            y = stk[tt -- ];
            id[y] = cnt;
        } while (x != y);
    }
}

int main()
{
    memset(h, -1, sizeof(h));
    scanf("%d%d", &n, &m);
    int x, y;
    for (int i = 0; i < m; ++ i )
    {
        scanf("%d%d", &x, &y);
        add(x, y), add(y, x);
    }
    
    tarjan(1, -1);
    for (int i = 0; i < idx; i ++ )
        if (st[i])
            d[id[e[i]]] ++ ;
    
    int res = 0;
    for (int i = 1; i <= cnt; ++ i )
        if (d[i] == 1) res ++ ;
        
    if (cnt == 1) puts("0");
    else printf("%d\n", (res + 1) / 2);
    return 0;
}

debug:^的優(yōu)先級(jí)小于!=

可以不使用st數(shù)組標(biāo)記橋:

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

const int N = 5010, M = 10010;
int h[N], e[M], ne[M], idx;
int dfn[N], low[N], tp, cnt;
int stk[N], tt, id[N];
int d[N];
int n, m;

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

void tarjan(int x, int from)
{
    dfn[x] = low[x] = ++ tp;
    stk[ ++ tt] = x;
    for (int i = h[x]; i != -1; i = ne[i])
    {
        int y = e[i];
        if (!dfn[y])
        {
            tarjan(y, i);
            low[x] = min(low[x], low[y]);
        }
        else if (i != (from ^ 1))
            low[x] = min(low[x], dfn[y]);
    }
    if (dfn[x] == low[x])
    {
        int y;
        cnt ++ ;
        do {
            y = stk[tt -- ];
            id[y] = cnt;
        } while (x != y);
    }
}

int main()
{
    memset(h, -1, sizeof(h));
    scanf("%d%d", &n, &m);
    int x, y;
    for (int i = 0; i < m; ++ i )
    {
        scanf("%d%d", &x, &y);
        add(x, y), add(y, x);
    }
    
    tarjan(1, -1);
    
    
    for (int x = 1; x <= n; ++ x )
        for (int i = h[x]; i != -1; i = ne[i])
        {
            int y = e[i];
            int a = id[x], b = id[y];
            if (a != b) d[a] ++ ;
        }
        
    int res = 0;
    for (int i = 1; i <= cnt; i ++ )
        if (d[i] == 1) res ++ ;
    
    if (cnt == 1) puts("0");
    else printf("%d\n", (res + 1) / 2);
    return 0;
}

1183. 電力

1183. 電力 - AcWing題庫(kù)
第三章 圖論 No.10無(wú)向圖的雙連通分量,AcWing算法提高課 課程記錄,圖論,算法

枚舉所有割點(diǎn),判斷刪除哪個(gè)割點(diǎn)后剩余的連通塊數(shù)量最大
剩余的連通塊數(shù)量為ans + cnt - 1
由于題目給定的圖并不是一個(gè)連通圖,所以可能存在多個(gè)連通塊,cnt為連通塊數(shù)量
枚舉所有割點(diǎn)只能在一個(gè)連通塊中枚舉,此時(shí)其他連通塊的數(shù)量為cnt - 1
又因?yàn)閍ns為刪除割點(diǎn)后,剩余連通塊最多的值,所以答案為ans + cnt - 1

這題的點(diǎn)編號(hào)從0開(kāi)始

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

const int N = 10010, M = 30010;
int h[N], e[M], ne[M], idx;
int dfn[N], low[N], tp, cnt;
int ans, n, m, root;

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

void tarjan(int x)
{
    dfn[x] = low[x] = ++ tp;
    int t = 0;
    for (int i = h[x]; i != -1; i = ne[i])
    {
        int y = e[i];
        if (!dfn[y])
        {
            tarjan(y);
            low[x] = min(low[x], low[y]);
            if (low[y] >= dfn[x]) t ++ ;
        }
        else low[x] = min(low[x], dfn[y]);
    }
    
    if (x != root) t ++ ;
    ans = max(ans, t);
}

int main()
{
    while (scanf("%d%d", &n, &m), n | m)
    {
        memset(h, -1, sizeof(h));
        memset(dfn, 0, sizeof(dfn));
        idx = tp = cnt = ans = 0;
        int x, y;
        for (int i = 0; i < m; ++ i )
        {
            scanf("%d%d", &x, &y);
            add(x, y), add(y, x);
        }
        for (root = 0; root < n; ++ root)
        {
            if (!dfn[root]) 
            {
                cnt ++ ;
                tarjan(root);
            }
        }
        printf("%d\n", ans + cnt - 1);
    }
    return 0;
}

debug:dfn數(shù)組沒(méi)有置空


396. 礦場(chǎng)搭建

396. 礦場(chǎng)搭建 - AcWing題庫(kù)
第三章 圖論 No.10無(wú)向圖的雙連通分量,AcWing算法提高課 課程記錄,圖論,算法

第三章 圖論 No.10無(wú)向圖的雙連通分量,AcWing算法提高課 課程記錄,圖論,算法
對(duì)于圖中的每個(gè)連通塊,分情況討論:

  1. 若連通塊無(wú)割點(diǎn),那么任意設(shè)置兩個(gè)救援點(diǎn)即可
  2. 若連通塊中有割點(diǎn),縮點(diǎn):將每個(gè)割點(diǎn)依然看成一個(gè)點(diǎn),將每個(gè)v-DCC向其包含的割點(diǎn)連線
  • 縮點(diǎn)后得到一棵樹(shù),對(duì)于葉子節(jié)點(diǎn),需要建立救援點(diǎn)。因?yàn)橹挥幸粋€(gè)點(diǎn)與其相連,若該點(diǎn)坍塌,需要在內(nèi)部建立救援點(diǎn)。假設(shè)內(nèi)部節(jié)點(diǎn)數(shù)量為cnt,方案數(shù)為cnt-1個(gè),去除割點(diǎn)
  • 對(duì)于非葉子節(jié)點(diǎn),無(wú)需建立救援點(diǎn),因?yàn)闊o(wú)論與之相連的哪個(gè)割點(diǎn)坍塌,該節(jié)點(diǎn)都能走到葉子節(jié)點(diǎn),而葉子節(jié)點(diǎn)已經(jīng)建立救援點(diǎn)
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;

typedef unsigned long long ULL;
const int N = 1010, M = 1010;
int h[N], e[M], ne[M], idx;
vector<int> dcc[N];
int dcnt, root;
int dfn[N], low[N], tp;
int stk[N], tt;
bool st[N];
int n, m;

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

void tarjan(int x)
{
    low[x] = dfn[x] = ++ tp;
    stk[ ++ tt ] = x;
    if (x == root && h[x] == -1)
    {
        dcnt ++ ;
        dcc[dcnt].push_back(x);
        return;
    }
    int t = 0;
    for (int i = h[x]; i != -1; i = ne[i])
    {
        int y = e[i];
        if (!dfn[y])
        {
            tarjan(y);
            low[x] = min(low[x], low[y]);
            if (low[y] >= dfn[x])
            {
                t ++, dcnt ++ ;
                if (x != root || t > 1) st[x] = true;
                int u;
                do {
                    u = stk[tt -- ];
                    dcc[dcnt].push_back(u);
                } while (u != y);
                dcc[dcnt].push_back(x);
            }
        }
        else low[x] = min(low[x], dfn[y]);
    }
}

int main()
{
    int T = 1;
    while (scanf("%d", &m), m)
    {
        for (int i = 0; i < N; ++ i ) dcc[i].clear();
        memset(h, -1, sizeof(h));
        memset(dfn, 0, sizeof(dfn));
        memset(st, false, sizeof(st));
        tp = dcnt = idx = tt = n = 0;
        for (int i = 0; i < m; ++ i )
        {
            int x, y;
            scanf("%d%d", &x, &y);
            add(x, y), add(y, x);
            n = max(n, x), n = max(n, y);
        }
        for (root = 1; root <= n; ++ root )
            if (!dfn[root]) tarjan(root);
        
        ULL sum = 1; int ans = 0;
        for (int i = 1; i <= dcnt; ++ i )
        {
            int t = 0;
            for (int j = 0; j < dcc[i].size(); ++ j )
                if (st[dcc[i][j]]) 
                    t ++ ;
            if (t == 0) 
            {
                if (dcc[i].size() > 1) ans += 2, sum *= ((ULL)dcc[i].size() * (dcc[i].size() - 1)) / 2;
                else ans ++ ;
            }
            else if (t == 1) ans += 1, sum *= (dcc[i].size() - 1);
        }
        printf("Case %d: %d %llu\n", T ++ , ans, sum);
    }
    return 0;
}

debug:由于多組測(cè)試數(shù)據(jù),沒(méi)有初始化干凈所有元素
最后統(tǒng)計(jì)救援點(diǎn)數(shù)量以及方案總數(shù)時(shí),沒(méi)有對(duì)孤立點(diǎn)進(jìn)行特判文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-652065.html

到了這里,關(guān)于第三章 圖論 No.10無(wú)向圖的雙連通分量的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(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.11二分圖,匈牙利算法與點(diǎn)覆蓋

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

    257. 關(guān)押罪犯 - AcWing題庫(kù) 最大最小問(wèn)題,一眼二分 答案的范圍在 [ 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與次小生成樹(shù)

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

    O ( m l o g n ) O(mlogn) O ( m l o g n ) ,n為節(jié)點(diǎn)數(shù)量,m為詢問(wèn)次數(shù),lca是一種在線處理詢問(wèn)的算法 自己也是自己的祖先 倍增: f a ( i , j ) fa(i, j) f a ( i , j ) 表示從i開(kā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. 蟲(chóng)洞 904. 蟲(chóng)洞 - AcWing題庫(kù) 這個(gè)==真的服,調(diào)半天,還有,鄰接表的大小又設(shè)置錯(cuò)了 01分?jǐn)?shù)規(guī)劃:361. 觀光奶牛 361. 觀光奶牛 - AcWing題庫(kù) 在圖論問(wèn)題中,所有形如:某個(gè)部分之和除以某個(gè)部分之和最大的問(wèn)題,被稱為01分?jǐn)?shù)規(guī)劃,通常使用二分解決這類問(wèn)題 根據(jù)題意

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

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

    連通分量是無(wú)向圖的概念,yxc說(shuō)錯(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最小生成樹(shù)之虛擬源點(diǎn),完全圖與次小生成樹(shù)

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

    虛擬源點(diǎn):1146. 新的開(kāi)始 1146. 新的開(kāi)始 - AcWing題庫(kù) 與一般的最小生成樹(shù)問(wèn)題不同,本題需要在建立電站的電井之間建立電網(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)過(guò)k條邊的最短路 倍增 多源匯最短路:1125. 牛的旅行 1125. 牛的旅行 - AcWing題庫(kù) 直徑概念:同一連通塊中,兩個(gè)距離最遠(yuǎn)的點(diǎn)之間的距離 如何求直徑?由于圖中存在著兩個(gè)連通塊,所以直接對(duì)全圖做一個(gè)flody,就能更

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

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

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

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

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

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

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

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

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

    2024年02月13日
    瀏覽(36)
  • C++算法之旅、06 基礎(chǔ)篇 | 第三章 圖論

    常用代碼模板3——搜索與圖論 - AcWing 盡可能往深處搜,遇到葉子節(jié)點(diǎn)(無(wú)路可走)回溯, 恢復(fù)現(xiàn)場(chǎng)繼續(xù)走 數(shù)據(jù)結(jié)構(gòu):stack 空間:需要記住路徑上的點(diǎn), (O(h)) 。 ? BFS使用空間少; 無(wú)最短路 性質(zhì) 每個(gè)DFS一定對(duì)應(yīng)一個(gè) 搜索樹(shù) ;要考慮用什么 順序 遍歷所有方案;DFS就是遞

    2024年02月10日
    瀏覽(35)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包