hdu 1863 最小生成樹

2021-06-29 14:20:38 字數 1336 閱讀 6665

還是最小生成樹,還是用了kruskal寫,就是有點不一樣的地方在於,他要讓你判斷是否能夠保證暢通,也就是是否能有最小生成樹,其實就是判斷是不是連通圖吧,因為連通圖一定會有最小生成樹。

一開始我的想法是,先進行一次並查集的合併與查詢,看一下有幾個集合,如果只有乙個集合的話就是連通圖,肯定有最小生成樹存在,如果多餘乙個集合就不會有,直接輸出問好。之後要記得還原根節點。。

附上**:

#include #include #include #include using namespace std;

#define m 1000000

int u[m],v[m],p[m],w[m];

int r[m],t[m];

int n,m;

int ans;

int cmp(int a,int b)

int find(int x)

void uni(int x,int y)

int kruskal()

}}int main()

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

}if(num!=1)

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

p[i] = i;

sort(r,r+n,cmp);

kruskal();

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

}return 0;

}

因為最小生成樹的邊一定是n-1條邊,那麼其實我們還可以計算一下邊數,在將找到的邊加入最小生成樹的時候順便做就行了,那麼如果這個邊數小於n-1的話,肯定就不是連通圖沒有最小生成樹。

**:

#include #include #include #include using namespace std;

#define m 1000000

int u[m],v[m],p[m],w[m];

int r[m],t[m];

int n,m;

int ans;

int cmp(int a,int b)

int find(int x)

bool kruskal()

}if(sum < m-1)

return false;

return true;

}int main()

sort(r,r+n,cmp);

bool ok = kruskal();

if(ok)

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做的,這次用prime做的,寫篇部落格記錄下。prime的複雜度為n 2 n為點的個數 與邊的個數無關,用於稠密圖,而kruskal的複雜度為mlgm m為邊的個數 與點的個數無關,主要用於稀疏圖。include include includeus...