最小生成树(二)...Kruskal算法
2016-06-10 11:00
351 查看
Kruskal算法
简单说明一下该算法
该算法就是不断向一个集合里不断加最短边,然后通过并查集判断是否可以加入此最短边。
typedef struct{
int x,y,len;
} Edge //这个结构体定义了一条边,其中x,y代表这个边的两个顶点,len代表这条边的长度
//当将所有边都记录在这样结构的数组中后,对这个数组进行按边的大小排序。
sort(Edge)
//假设有n个顶点,所以需要加入n-1条边,然后从边集合里依次判断能否加入,直到加入了n-1条边
简单说明一下该算法
该算法就是不断向一个集合里不断加最短边,然后通过并查集判断是否可以加入此最短边。
typedef struct{
int x,y,len;
} Edge //这个结构体定义了一条边,其中x,y代表这个边的两个顶点,len代表这条边的长度
//当将所有边都记录在这样结构的数组中后,对这个数组进行按边的大小排序。
sort(Edge)
//假设有n个顶点,所以需要加入n-1条边,然后从边集合里依次判断能否加入,直到加入了n-1条边
#include<iostream> #include<algorithm> using namespace std; #define MAX 200 // denote the maximun number of the vertexs struct Edge{ int x,y,len,flag; }; Edge E[MAX*MAX/2]; int len=0,ans=0,d[MAX],g[MAX][MAX]; bool cmp(Edge,Edge); int Find(int x,int *a); void Union(int x,int y,int *a); bool isNconnected(int x,int y,int *a); int main(){ int n; while(cin>>n){ for(int i=0;i<n;++i) for(int j=0;j<n;++j) cin>>g[i][j]; for(int i=0;i<n;++i) for(int j=0;j<i;++j){ E[len].x = i,E[len].y = j,E[len].len = g[i][j]; len++; } sort(E,E+len,cmp); for(int i=0;i<n;++i)d[i] = i; for(int j=0,i=0;j<n-1&&i<len;++i){ if(isNconnected(E[i].x,E[i].y,d)){ Union(E[i].x,E[i].y,d); ans+=E[i].len , ++j; } } cout<<ans<<endl; } return 0; } bool cmp(Edge x,Edge y){ return x.len<y.len; } int Find(int x,int *a){ if(a[x] == x)return x; return a[x] = Find(a[x],a); } void Union(int x,int y,int *a){ int i = Find(x,a), j = Find(y,a); a[i] = j; } bool isNconnected(int x,int y,int *a){ return Find(x,a) != Find(y,a); }
相关文章推荐
- 机器学习物语(1):世界观设定
- dockPanel左侧的宽度
- qt鼠标事件总结(转)
- Shiro Review——自定义Realm实现授权
- Codevs 1065 01字符串
- Shiro Review——自定义Realm实现授权
- 关于C++中的临时对象问题
- 大道理
- Struts2使用OGNL和校验框架
- 每天一命令(5) rm (remove files or directories) 1分钟
- JAXB注解 java 关于xml的注解,自动生成xml文件 - @XML***
- 313. Super Ugly Number
- Linux开启之谜
- 客户端使用java,服务端使用c++的corba编程环境搭建
- 页面悬浮框
- ubuntu12.04修改键盘
- Linux常用命令
- Android Framework综述
- C++单例模式
- Android之GLES2.0显示立方体各面不同图片测试代码