SSL ZYC 1764 最小生成樹

2021-08-17 09:33:44 字數 1308 閱讀 9136

題目大意:

求出最小生成樹。

思路:

這道題有兩種方法:

(1)最小生成樹

(2)並查集

最小生成樹:

資料n<=5000,簡直就是dij的模版。。。

並查集:

以兩點之間的距離從小到大排序,再利用貪心思想,如果father[i]!=father[j],那麼將i的父親指向j,再用sum加上這兩點之間的距離,加上一點優化即可ac。

**:最小生成樹:

#include 

using

namespace

std;

int a[5001][5001],n,b[5001],k,sum,minn,c[5001];

int main()

b[i]=i;

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

if (a[1][i]!=0) c[i]=a[1][i]; //初始化

for (int q=1;q<=n-1;q++)

}c[k]=0;

b[k]=1;

sum+=minn;

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

if (b[i]!=1&&c[i]>a[k][i]) c[i]=a[k][i]; //重新賦值

}printf("%d\n",sum);

return

0;}

並查集:
#include 

#include

#include

#include

using

namespace

std;

int n,k,sum,m;

map father;

struct n

a[2500001];

int cmp(n q,n p)

int main()

sort(a+1,a+1+k,cmp); //快排

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

father[i]=i; //並查集初始化

int j=0;

for (int i=1;iif(find(a[i].x)==find(a[i].y)) continue;

father[find(a[i].y)]=find(a[i].x); //將a[i].y的父親指向a[i].y

sum+=a[i].f;

if (++m==n-1) break; //優化

}printf("%d\n",sum);

return

0;}

SSL ZYC 1764 最小生成樹

題目大意 求出最小生成樹。思路 這道題有兩種方法 1 最小生成樹 2 並查集 最小生成樹 資料n 5000,簡直就是dij的模版。並查集 以兩點之間的距離從小到大排序,再利用貪心思想,如果father i father j 那麼將i的父親指向j,再用sum加上這兩點之間的距離,加上一點優化即可ac。...

ssl1764 最小生成樹II

最小生成樹ii time limit 10000ms memory limit 65536k total submit 314 accepted 142 case time limit 1000ms description 農民約翰被選為他們鎮的鎮長!他其中乙個競選承諾就是在鎮上建立起網際網路,並連...

最小生成樹 次小生成樹

一 最小生成樹 說到生成樹首先要解釋一下樹,樹是乙個聯通的無向無環圖,多棵樹的集合則被稱為森林。因此,樹具有許多性質 1.兩點之間的路徑是唯一的。2.邊數等於點數減一。3.連線任意兩點都會生成乙個環。對於乙個無向聯通圖g的子圖,如果它包含g的所有點,則它被稱為g的生成樹,而各邊權和最小的生成樹則被稱...