标签:names oid 相同 gis 不能 说明 最小生成树算法 struct space
最小生成树算法
是图论的一种算法
用N个点用N-1条边连成一棵树
所以在图中选N个点与N-1条边
使在所有方案中和最小
1°:
Prim算法
Kruskal算法
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 5 using namespace std; 6 7 int f[300000]; 8 9 struct point{ 10 int x; 11 int y; 12 int z; 13 }edge[300000]; 14 15 bool cmp(point a,point b) 16 { 17 return a.z<b.z; 18 } 19 20 inline int Find(int a) 21 { 22 if(f[a]!=a) f[a]=Find(f[a]); 23 return f[a]; 24 } 25 26 inline void join(int a,int b) 27 { 28 int fa=Find(a); 29 int fb=Find(b); 30 if(fa!=fb) f[fa]=fb; 31 } 32 33 int main(void) 34 { 35 36 int n,m; 37 38 scanf("%d%d",&n,&m); 39 40 for(register int i=1;i<=m;i++) 41 scanf("%d%d%d",&edge[i].x,&edge[i].y,&edge[i].z); 42 43 sort(edge+1,edge+1+m,cmp); 44 45 for(register int i=1;i<=n;i++) 46 f[i]=i; 47 48 int tot=0; 49 50 int k=0; 51 52 for(int i=1;i<=m;i++) 53 { 54 55 if(Find(edge[i].x) != Find(edge[i].y)) 56 { 57 join(edge[i].x,edge[i].y); 58 tot+=edge[i].z; 59 k++; 60 } 61 if(k==n-1) break; 62 63 } 64 65 printf("%d",tot); 66 }
克鲁斯卡尔算法使用的了
并查集思想
快速排序
优先连权值更大的边
复杂度为 O(mlogm)
而普利姆算法则采用dp思想,复杂度为 O(N^2),优化后达到 O(mlogn)
综合比对来看
1°Prim在稠密图中比Kruskal优,稀疏图劣
2°Prim在任何情况下均有令人满意的时间复杂度,代价就是空间复杂度极高,并且代码极其恶心
但是时间复杂度不能说明一个算法的优劣性质
所以考试,你想用啥就用啥。
标签:names oid 相同 gis 不能 说明 最小生成树算法 struct space
原文地址:https://www.cnblogs.com/-Iris-/p/12691529.html