HDU 1863 最小生成樹

2021-06-29 01:14:49 字數 939 閱讀 5742

這還是最小生成樹的模版題, 以前都是用的kruskal做的, 這次用prime做的, 寫篇部落格記錄下。prime的複雜度為n^2(n為點的個數),與邊的個數無關,用於稠密圖, 而kruskal的複雜度為mlgm(m為邊的個數)與點的個數無關, 主要用於稀疏圖。

#include#include#includeusing namespace std;

const int inf = 1000000000;

const int maxn = 100 + 10;

int g[maxn][maxn], lowcost[maxn], closeset[maxn];

//g陣列存圖, lowcost陣列存的是能到達頂點i的最小權值, closeset陣列為到達i頂點的前乙個頂點,可用來輸出路徑

bool used[maxn];

//用來標記頂點是否選過

int prime(int n)

used[0] = true;

closeset[0] = -1;//用來路徑輸出時判斷結束

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

//如果minn值為inf說明圖不連通

if(minn == inf)

return -1;

used[p] = true;

ans += minn;

for(int j = 0; j < n; j++)

if(!used[j] && lowcost[j] > g[p][j])

}return ans;

}int main()

int ans = prime(n);

if(ans != -1)

printf("%d\n", ans);

else

printf("?\n");

}return 0;

}

hdu 1863 最小生成樹

使用並查集,陣列不要太小 include stdio.h int set 200 int n,m typedef struct nodenode,pnode node road 200 void init int find int u return set u int join int u,int ...

hdu 1863(最小生成樹)

基礎的最小生成樹問題,不過 要特判條件不足的情況 include include define inf 1 30 int n,m,vis 110 low 110 int map 110 110 int init int prim if pos 1 return 1 代表這當前步驟缺少條件 int k...

hdu 1863 最小生成樹

還是最小生成樹,還是用了kruskal寫,就是有點不一樣的地方在於,他要讓你判斷是否能夠保證暢通,也就是是否能有最小生成樹,其實就是判斷是不是連通圖吧,因為連通圖一定會有最小生成樹。一開始我的想法是,先進行一次並查集的合併與查詢,看一下有幾個集合,如果只有乙個集合的話就是連通圖,肯定有最小生成樹存在...