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...