kruskal算法,没有进行算法复杂度分析

判断俩个结点是否在同一个树上使用了dfs,比较low的写法

输入数据

//第一行,结点数,结点数,边数

9 9 14
a b 4
b c 8
c d 7
a h 8
b h 11
h i 7
i c 2
i g 6
c f 4
d f 14
d e 9
f e 10
g h 1
g f 2

//============================================================================
// Name : kruskal.cpp
// Author : caicai
// Version :
//============================================================================ #include <iostream>
#include <stdio.h>
#include <memory.h>
using namespace std; struct Node
{
char s;
char e;
int w;
}; void printMap(int r, int a[][100])
{
for(int i = 0; i < r; i++)
{
for(int j = 0; j < r; j++)
{
printf("%-3d", a[i][j]);
}
cout << endl;
}
cout << endl;
}
/**
* 边根据权重从小到大排序
*/
void sortEdge(Node edges[], int total)
{
Node temp;
for(int i = 0; i < total; i++)
{
for(int j = 1; j < total; j++)
{
if(edges[j - 1].w > edges[j].w)
{
temp = edges[j - 1];
edges[j - 1] = edges[j];
edges[j] = temp;
}
}
}
}
void printEdges(Node edges[], int total)
{
for(int i = 0; i < total; i++)
cout << edges[i].s << " " << edges[i].e << " " << edges[i].w << endl;
}
void dfs(int a[][100], int r, int s, int e, int* ok, int vis[])
{
for(int i = 0; i < r; i++)
{
if(vis[i] || a[s][i] == 0)
{
//走过,不存在的路
continue;
}
if(i == e)
{
//可到
*ok = 0;
return;
}
vis[i] = 1;
//从当前结点出发,不需要回溯,如果当前结点到不了,从其他结点到当前结点同样是到不了
dfs(a, r, i, e, ok, vis);
}
}
void kruskal(int a[][100], int r, Node edges[], int et)
{
/**
* 图G n个结点,刚开始每一个结点都一个单独的结点,并没有与任何结点连接
* 将边按照权值从小到大排序
* 循环边集合,检查该边连接的俩个点,是否在同一个树上,如果是,不要,如果不是,加入到最小生成树中
* 怎么检查,a到b是否有一个条路
* 检查是否在同一个树中,dfs检查
*/
/*
*1初始化:生成的树为空,总权值为0
*2循环:每一次循环边,加入到数组a,数组a中包含n棵树,对于每一颗树,加入的边的权值最小,所以加入此边后形成的树的总权也是最小的
* 当俩棵树合并时,每棵的树的总权值也是最小的,所以相加后总权也是最小
*3终止:每一次加入的边是权值也是最小的,所以循环终止时,总权也是最小的
*/
for(int i = 0; i < et; i++)
{
char s = edges[i].s;
char e = edges[i].e;
int ok = 1;
int vis[100];
memset(vis, 0, sizeof(vis));
//检查耗时
dfs(a, r, s - 'a', e - 'a', &ok, vis);
if(ok)
{
//不在同一颗树中,当前的边加入到树中
a[s - 'a'][e - 'a'] = edges[i].w;
//无向图
a[e - 'a'][s - 'a'] = edges[i].w;
}
}
}
int main()
{
freopen("d:\\2.txt", "r", stdin);
int r;
int te;
cin >> r >> r >> te;
char s, e;
int w;
int a[100][100];
Node edges[100];
int et = 0;
while (te--)
{
cin >> s >> e >> w;
//cout << s << " " << e << " " << w << endl;
Node node;
node.s = s;
node.e = e;
node.w = w;
edges[et++] = node;
}
sortEdge(edges, et);
printEdges(edges, et);
kruskal(a, r, edges, et);
printMap(r, a);
return 0;
}

  输出

g h 1
i c 2
g f 2
a b 4
c f 4
i g 6
c d 7
h i 7
b c 8
a h 8
d e 9
f e 10
b h 11
d f 14
0 4 0 0 0 0 0 0 0
4 0 8 0 0 0 0 0 0
0 8 0 7 0 4 0 0 2
0 0 7 0 9 0 0 0 0
0 0 0 9 0 0 0 0 0
0 0 4 0 0 0 2 0 0
0 0 0 0 0 2 0 1 0
0 0 0 0 0 0 1 0 0
0 0 2 0 0 0 0 0 0

  

最小生成树-kruskal的更多相关文章

  1. 模板——最小生成树kruskal算法+并查集数据结构

    并查集:找祖先并更新,注意路径压缩,不然会时间复杂度巨大导致出错/超时 合并:(我的祖先是的你的祖先的父亲) 找父亲:(初始化祖先是自己的,自己就是祖先) 查询:(我们是不是同一祖先) 路径压缩:(每 ...

  2. 最小生成树——Kruskal与Prim算法

    最小生成树——Kruskal与Prim算法 序: 首先: 啥是最小生成树??? 咳咳... 如图: 在一个有n个点的无向连通图中,选取n-1条边使得这个图变成一棵树.这就叫“生成树”.(如下图) 每个 ...

  3. 【转】最小生成树——Kruskal算法

    [转]最小生成树--Kruskal算法 标签(空格分隔): 算法 本文是转载,原文在最小生成树-Prim算法和Kruskal算法,因为复试的时候只用到Kruskal算法即可,故这里不再涉及Prim算法 ...

  4. 最小生成树 kruskal算法 codevs 1638 修复公路

    1638 修复公路  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description A地区在地震过后,连接所有村庄的公 ...

  5. 最小生成树——kruskal算法

    kruskal和prim都是解决最小生成树问题,都是选取最小边,但kruskal是通过对所有边按从小到大的顺序排过一次序之后,配合并查集实现的.我们取出一条边,判断如果它的始点和终点属于同一棵树,那么 ...

  6. 贪心算法-最小生成树Kruskal算法和Prim算法

    Kruskal算法: 不断地选择未被选中的边中权重最轻且不会形成环的一条. 简单的理解: 不停地循环,每一次都寻找两个顶点,这两个顶点不在同一个真子集里,且边上的权值最小. 把找到的这两个顶点联合起来 ...

  7. 最小生成树---Kruskal/Prime算法

    1.Kruskal算法 图的存贮采用边集数组或邻接矩阵,权值相等的边在数组中排列次序可任意,边较多的不很实用,浪费时间,适合稀疏图.      方法:将图中边按其权值由小到大的次序顺序选取,若选边后不 ...

  8. 【BZOJ-2177】曼哈顿最小生成树 Kruskal + 树状数组

    2177: 曼哈顿最小生成树 Time Limit: 10 Sec  Memory Limit: 259 MBSubmit: 190  Solved: 77[Submit][Status][Discu ...

  9. 最小生成树Kruskal算法(邻接矩阵和邻接表)

    最小生成树,克鲁斯卡尔算法. 算法简述: 将每个顶点看成一个图. 在所有图中找权值最小的边.将这条边的两个图连成一个图, 重复上一步.直到只剩一个图. 注:将abcdef每个顶点看成一个图.将最小权值 ...

  10. 最小生成树 kruskal hdu 5723 Abandoned country

    题目链接:hdu 5723 Abandoned country 题目大意:N个点,M条边:先构成一棵最小生成树,然后这个最小生成树上求任意两点之间的路径长度和,并求期望 /************** ...

随机推荐

  1. Windows Server2008 R2性能优化方法

    经常使用的是Windows 2008R2企业版的服务器,简单总结一下性能优化的方法 ========================================================== ...

  2. LG3898 [湖南集训]大新闻

    题意 题目描述 **记者弄了个大新闻,这个新闻是一个在 [0,n) 内等概率随机选择的整数,记其为 x.为了尽可能消除这个大新闻对公众造成的不良印象,我们需要在 [0,n)内找到某一个整数 y,使得 ...

  3. matplotlib-------标记特殊点

    import matplotlib.pyplot as plt import numpy as np def demo_test(): a=np.array([0.15,0.16,0.14,0.17, ...

  4. 读写XML文档时,去掉新增加节点的“空命名空间”(xmlns=””)

    在做对ReprotViewer编程时,想做一个用户可以更改显示/打印列的功能,大致看了下,只需要通过对rdlc文件中改变其<Hidden>节点值为false/true,即可实现对应某列的显 ...

  5. web.xml中context-param详解

    <context-param> <param-name>contextConfigLocation</param-name> <param-value> ...

  6. 协程、gevent实现异步io、进程、线程、协程对比

    异步io的说白了就是遇到io操作的时候,就停下来去做别的事情.io分网络io和磁盘io,网络io比如说打开一个网站获取数据,下载一首歌等等,磁盘io就是把数据存到一个文件里面,写到磁盘上. 从网站上获 ...

  7. Nginx 下部署 HTTPS 与安全调优

    什么是 HTTPS?# HTTPS(全称:Hyper Text Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的 ...

  8. Ionic 3 自定义组件的使用

    1. 创建组件 ionic g component myComponent myComponent为组件名称 创建好后,生成的文件如下图 2. 在Page 中使用 使用的是home 在home.htm ...

  9. ML(5):KNN算法

    K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,可以简单的理解为由那离自己最近的K个点来投票决定待分类数据归为哪一类.这个算法是机器学习里面一个比较经典的算法, ...

  10. 10个CSS+HOVER 的创意按钮

    CSS hover 样式很简单,但是想创造出有意思.实用.有创意性的特效是很考验设计师的创意能力,所以设计达人每隔一段时间都会分享一些与鼠标点击.悬停的相关特效,以便大家获得更好的创造灵感. 今天我们 ...