題解 洛谷P1546 最短網路(最小生成樹)

2021-08-21 15:13:01 字數 1015 閱讀 3197

kruskal演算法的步驟包括:

1. 對所有權值進行從小到大排序(這裡對邊排序時還需要記錄邊的索引,這樣以邊的權值排完序後只改變了權值的索引位置)

2. 然後每次選取最小的權值,如果和已有點集構成環則跳過,否則加到該點集中。最終有所有的點集構成的樹就是最佳的。

#include #include #include #include #include #include #define maxn 100010

using namespace std;

int n;

int a;

struct edge

;struct edge e[maxn];

int f[101]=,sum=0;

bool cmp(edge a,edge b)

,v的初始集合為。

2. 針對u開始找u中各節點的所有關聯的邊的權值最小的那個,然後將關聯的節點vi加入到u中,並且從v中刪除(注意不能形成環)。

3. 遞迴執行步驟2,直到v中的集合為空。

4. u中所有節點構成的樹就是最小生成樹。

#include#include#includeusing namespace std;

const int maxn=110;

int e[maxn][maxn],dis[maxn];

bool b[maxn];

int ans=0;

int n;

int main() }

int u,minn;

for(int i=1;i<=n;i++)

b[1]=true;

for(int i=1;i<=n;i++)

for(int i=1;i<=n;i++)

}if(minn==1e9) break;

ans+=minn;

b[u]=true;

for(int v=1;v<=n;v++)

} }

cout

}

洛谷P2384 最短路 題解

請你求出從1到n的最短路徑,其中最短路徑 這條路經過的邊的權值的乘積。很顯然,這也是一道經典的單元最短路問題,首先我們可以考慮使用floyd,顯然,這是乙個比較無腦簡單的最短路演算法,而且包治負邊權等等。但是時間複雜度太高,可達o n3 o n 3 o n3 這道題目看起來可能是剛剛好,但據說會被卡...

洛谷P2384 最短路 題解

請你求出從1到n的最短路徑,其中最短路徑 這條路經過的邊的權值的乘積。很顯然,這也是一道經典的單元最短路問題,首先我們可以考慮使用floyd,顯然,這是乙個比較無腦簡單的最短路演算法,而且包治負邊權等等。但是時間複雜度太高,可達o n 3 o n3 這道題目看起來可能是剛剛好,但據說會被卡常數呀。再...

洛谷P1144最短路計數題解

此題還是尋找從1到i點總共有幾個最短路且每條邊的邊長為1,對於這種尋找最短路的個數,我們可以反向搜尋,即先用 spfa 預處理出所有點的最短路,然後我們反向記憶化搜尋,可以用 sum i 表示從i到1的最短路個數,然後我們初始化 sum 1 1 然後就可以了 include include incl...