題目大意:
求出最小生成樹。
思路:
這道題有兩種方法:
(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的生成樹,而各邊權和最小的生成樹則被稱...