最小生成树
2015-06-14 15:31
211 查看
最小生成树是含有n个结点的连通图的极小连通子图,且包含原图中的所有 n 个结点,并且含有保持图连通的最少的边。
求解最小生成树可以用Prim或者Kruskal算法。
求解最小生成树可以用Prim或者Kruskal算法。
int n; //顶点数 int m; //边数 /*Prim算法*/ int vis[maxn]; int pre[maxn]; int dist[maxn]; int G[maxn][maxn]; void Prim() { //边初始化为无穷大 for(int i=0; i<maxn; i++) for(int j=i; j<maxn; j++) G[i][j] = G[j][i] = INF; for(int i=0; i<m; i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); G[u][v] = G[v][u] = w; } memset(vis,0,sizeof(vis)); vis[1] = 1; //最小距离为到出发点的距离 for(int i=1; i<=n; i++) { dist[i] = G[1][i]; pre[i] = 1; } for(int i=1; i<n; i++) { //找到一个距离最小的新的顶点 int u=-1; for(int j=1; j<=n; j++) if(!vis[j]) if(u==-1 || dist[u]>dist[j]) u=j; printf("%d %d %d\n",pre[u],u,G[pre[u]][u]); vis[u] = 1; //最小距离更新 for(int j=1; j<=n; j++) { if(!vis[j]) { if(dist[j]>G[u][j]) { dist[j] = G[u][j]; pre[j] = u; } } } } } /*Kruskal算法(并查集)*/ typedef struct Edge { int u; int v; int w; }Edge; Edge e[maxn]; int fa[maxn]; bool cmp(const Edge &a,const Edge &b) { return a.w < b.w; } int find_fa(int x) { if(fa[x] != x) fa[x] = find_fa(fa[x]); return fa[x]; } void Kruskal() { for(int i=0; i<m; i++) scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w); for(int i=0; i<maxn; i++) fa[i] = i; sort(e,e+m,cmp); for(int i=0; i<m; i++) { int u = e[i].u; int v = e[i].v; int w = e[i].w; int fa_u = find_fa(u); int fa_v = find_fa(v); if(fa_u != fa_v) { printf("%d %d %d\n",u,v,w); fa[fa_v] = fa_u; } } }
相关文章推荐
- 【Android】进度条与线程之间的消息处理
- 归并排序的实现
- Android 4.4 AMS 学习笔记
- wpf下实现简单截图
- 线段树
- 第三节:反射的性能
- 使用JSON数据格式模拟股票实时信息
- [写代码]处理一组lrc歌词文件
- 黑马程序员——JAVA集合
- model 键值对
- 协议栈资料收集和大牛经验收集----阿冬!!!
- Linux内存管理
- Java安全之SSL/TLS
- 踏得网
- Principle of Computing(1)
- 如何开发一个java开源框架-----Jvn框架之实现用注解代替配置文件
- 19 Remove Nth Node From End of List(去掉链表中倒数第n个节点Easy)
- linux基本命令-mysql命令
- div边框弧形设计,radius的用法,CSS3 border-radius 属性
- JAVA中断线程Thread.interrupt()