最小生成树
来源:互联网 发布:分水岭算法 过分割 编辑:程序博客网 时间:2024/06/07 16:30
最小生成树有很多种做法,大家应该都知道。
今天笔者专门为大家介绍两种做法:
代码比较丑,很久以前写的,不要见怪,在此博主致以强烈的抱歉。
方法一:邻接矩阵读入,prim算法处理
#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<iostream>#include<algorithm>using namespace std;int main(){ int n,map[101][101],d[101],ans=0; bool f[101]; scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) scanf("%d",&map[i][j]); for(int i=2;i<=n;i++) d[i]=1000000000; memset(f,false,sizeof(f)); d[1]=0; for(int i=1;i<=n;i++){ int min=2147483647,x; for(int j=1;j<=n;j++) if(!f[j] && d[j]<min){ min=d[j]; x=j; } ans+=min; f[x]=true; for(int j=1;j<=n;j++) if(!f[j] && map[x][j]<d[j]) d[j]=map[x][j]; } printf("%d\n",ans); return 0;}
方法二:邻接表读入,kruskal处理
#include<iostream>using namespace std;struct node{ int x,y,w;};struct node a[1000];int f[1000];int cha(int x){ while(f[x]!=x) x=f[x]; return x;}int main(){ int i,j,k,m,n; cin>>n>>m; for(i=1;i<=m;i++) cin>>a[i].x>>a[i].y>>a[i].w; for(i=1;i<m;i++) for(j=i+1;j<=m;j++) if(a[i].w>a[j].w){ struct node tmp=a[i]; a[i]=a[j]; a[j]=tmp; } for(i=1;i<=n;i++)f[i]=i; int ans=0,s=0; for(i=1;i<=m;i++) if(cha(a[i].x)!=cha(a[i].y)){ f[cha(a[i].x)]=cha(a[i].y); s++; ans+=a[i].w; if(s>=n-1)break; } cout<<ans<<endl; return 0;}
0 0
- 最小比例 最小生成树
- 最小生成树&&次最小生成树
- 最小生成生成树计数
- 树+最小生成树
- 最小生成树
- 最小生成树 MST
- 最小生成树Kruskal
- kruskal 最小生成树
- 最小生成树
- 最小生成树
- 最小生成树
- 最小生成树
- 最小生成树 MST
- 最小生成树问题
- 最小生成树
- 最小生成树
- 最小生成树
- 最小生成树
- NOIP2010提高组 引水入城
- 将博客搬至CSDN
- Leetcode 63 Unique Paths II
- RSA、DES 、AES、MD5加密、解密
- java应用中的集合
- 最小生成树
- ubuntu环境下快速简单的生成gif动画
- 如何知道DLL是32位还是64位
- 学 Win32 汇编[28] - 跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等
- 欢迎使用CSDN-markdown编辑器
- Python for Data Analysis (8)
- BOM学习笔记----------(一)
- 实时计算实践(spark streaming+kafka+hdfs)
- Toast总结一