kruskal算法..


#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<stack>// 用 stl 栈 存储
#define MAXSIZE 1000
using namespace std;



  Kruskal算法  生成最小生成树
/******
测试样本1:
5
1 2 3
2 3 4
4 5 6
2 4 3
5 2 8
1 4 1
3 5 7
1 5 2
0 0 0//8组数据

//标准测试数据(题目给的):
9
1 2 32.8
1 3 44.6
1 8 12.1
1 9 18.2
2 3 5.9
3 4 21.3
3 5 41.1
3 7 56.4
4 5 67.3
4 6 98.7
5 6 85.6
5 7 10.5
6 9 79.2
7 8 52.5
8 9 8.7
0 0 0

*******/


/*
程序实现流程:

1.输入数据

2.处理输入数据,对数据进行排序

3.寻找最小生成树

4.输出算法结果

5.a.对图进行修改 修改后返回2
b.重新输入数据(即返回1)
c.退出程序

************/
/


int ver_num;//点的个数
int vertex[MAXSIZE];//点数组 用于确定点的集合  用并查集确定点是否在同一集合内


typedef struct edge
{
	int v1, v2;
	double weight;
}Edge, *Edge_ptr;//边


Edge_ptr G_Edge[MAXSIZE];//边数组  边的排序采用选择排序
int G_Edge_n;//边个数

stack<Edge> S;//栈用来存储算法结果

bool flag;//用来表示是否找到 最小生成树 1表示成功  0表示失败

void input()
{
	int a, b;double w;
	printf("input the number of vertex:");
	scanf_s("%d", &ver_num); 
	getchar();//吸收回车
	printf("the ver(s) you can use are:");
	for (int i = 1; i <= ver_num; i++) printf("%4d", i);
	printf("\n");

	int j = 0;
	printf("请输入边信息:(如1 2 3.5)(表示点1和点2直接的距离为3.5)(输入0 0 0代表输入结束)\n");
	printf("请输入边信息(v v w):");
	while (scanf_s("%d %d %lf", &a, &b, &w) && a && b && w)
	{
		getchar();
		Edge_ptr t;
		if (!(t = (Edge_ptr)malloc(sizeof(Edge)))) exit(1);
		t->v1 = a; t->v2 = b; t->weight = w;
		j++;
		G_Edge[j] = t;
		printf("请输入边信息(v v w):");
	}
	getchar();
	printf("输入结束\n\n");
	G_Edge_n = j;
	printf("you have input %d vers and %d edges\n", ver_num, G_Edge_n);

}

void mysort()
{//选择排序法
	int num = G_Edge_n;//对 索引为  1 到 num  的边数组进行排序
	int i, j, k;
	Edge_ptr t;
	for (i = 1; i < num; i++)//找出当前第i条边
	{
		k = i;//用k代表当前的最小的边
		for (j = k + 1; j <= num; j++)
		{
			if (G_Edge[j]->weight < G_Edge[k]->weight) k = j;//如果第j条边的权 比第k条边小 那么让k=j;让k始终指向当前权值最小的边
		}
		//swap k,i
		if (k != i)//如果第i条边不是最小的  就让k和i交换  是第i条边成为当前最小的边
		{
			t = G_Edge[k];  G_Edge[k] = G_Edge[i];  G_Edge[i] = t;
		}
	}
}

int find(int t)//寻找点t所属于的 最终点的集合
{
	if (t == vertex[t]) return t;
	else return find(vertex[t]);
}
int is_in(int a, int b)
{//判断点a和点b是否在同一集合里
	return find(a) == find(b);// true 则表示 a 已经在一个集合里了
}
int union_v(int a, int b)
{//使不在统一集合里的两个点 成为同一个集合  即添加一条端点为ab的边
	if (is_in(a, b)) return 0;//两个点本来就在一个结合里面
	int x = find(a), y = find(b);
	vertex[x] = y;
	return 1;//通过一条边 将两个集合 合并为一个集合
}


void solve()
{//kruskal算法求最小生成树
	int i;
	int e_num = 0;//e_num用来表示 已经选定的边的个数
	//init ver[]
	for (int i = 1; i <= ver_num; i++) vertex[i] = i;//初始化点数组

	for (i = 1; i <= G_Edge_n && e_num < ver_num - 1; i++)
	{
		if (is_in(G_Edge[i]->v1, G_Edge[i]->v2)) continue;//如果该边可以连成回路 则放弃该边
		union_v(G_Edge[i]->v1, G_Edge[i]->v2);//否则 确定该边 使两端点 在同一个集合中
		e_num++;//
		S.push(*G_Edge[i]);//将这条边存储在栈中
	}

	if (e_num == ver_num - 1)  flag = 1;//如果 e_num==ver_num-1 表示 找到了最小生成树 flag=1;
	else flag = 0;//没找到

}

void output()//输出算法结果
{
	printf("************************************************\n");
	Edge tt;
	if (flag == 1)//如果找到的话
	{
		printf("找到最小生成树\n");
		printf("构成最小生成树的边如下(v v w):\n");
		while (!S.empty())
		{
			tt = S.top(); S.pop();
			printf("%d %d %.1lf\n", tt.v1, tt.v2, tt.weight);
		}
	}
	else printf("kruskal failed!\n-.-\n");//没找到的话
	printf("************************************************\n");
}

void  AddVer()//新增一个点
{
	ver_num++;
	printf("增加一个节点%d,当前有%d个节点\n", ver_num, ver_num);
}
//void  DelVer()//删除一个点{ ;}//没要求写
void  AddEdge()//新增一条边
{
	int a, b; double w;
	printf("请输入边信息(v v w):");
	scanf_s("%d %d %lf", &a, &b, &w);
	getchar();

	Edge_ptr t;
	if (!(t = (Edge_ptr)malloc(sizeof(Edge)))) exit(1);
	t->v1 = a; t->v2 = b; t->weight = w;
	G_Edge_n++;
	G_Edge[G_Edge_n] = t;
	printf("新增一条边 (%d,%d,%4.1lf),当前%d条边\n", G_Edge[G_Edge_n]->v1, G_Edge[G_Edge_n]->v2, G_Edge[G_Edge_n]->weight, G_Edge_n);
 }
//void DelEdge(){ ; }//没要求写

void alter()
{
	//a.增加一个点
	b.减少一个点
	//c.增加一条边
	d.减少一条边
	//e.修改完毕,重新计算
	char cc;
	while (1)
	{
		//choose menu
		printf("   a.增加一个点\n");
		//printf("b.减少一个点\n");
		printf("  c.增加一条边\n");
		//printf("d.减少一条边\n");
		printf("  e.修改完毕,重新计算\n");

		cc = getchar(); 
		getchar();
		switch (cc)
		{
		case 'a':AddVer();
			break;

		//case 'b': DelVer();	break;

		case 'c':AddEdge();
			break;

		//case 'd':DelEdge();	break;

		case 'e':
			break;

		}
		if (cc == 'e')break;
	}

}

void menu(int i)
{
	if (i == 1)
	{
		printf("*****************************************************\n");
		printf("**                                                 **\n");
		printf("**        课程设计报告                             **\n");
		printf("**                                                 **\n");
		printf("*****************************************************\n");
		printf("**                                                 **\n");
		printf("**管道铺设施工                                     **\n");
		printf("**【问题描述】                                     **\n");
		printf("**需要在某个城市的n个居民区之间铺设煤气管道,则在这**\n");
		printf("**n个居民区之间只要铺设n - 1条管道即可。假设任意两 **\n");
		printf("**个居民区之间都可以架设管道,但由于地理环境的不同 **\n");
		printf("**,所需经费不同。选择最优的施工方案能使投资尽可能 **\n");
		printf("**少,这个问题即为求网络的最小生成树。             **\n");
		printf("**                                                 **\n");
		printf("*****************************************************\n");
	}
	else
	{
		printf("*****************************************************\n");
		printf("**                                                 **\n");
		printf("**        课程设计报告完毕                         **\n");
		printf("**                                                 **\n");
		printf("*****************************************************\n");

	}

}

//主函数
int main()
{
	char c;
	menu(1);//start menu
	while (1)
	{

		input();

		while (1)
		{
			mysort();

			solve();

			output();

			//choose menu
			printf(" a.修改图\n");
			printf(" b.输入新图\n");
			printf(" c.退出程序\n");

			printf("choose:");
			c = getchar(); 
			getchar();
			if (c == 'a')
			{
				alter();
				continue;
			}
			else if (c == 'b' || c == 'c')
			{
				break;
			}
			else printf("input error!\n");
		}
		if (c == 'c') break;
	}
	//end menu
	menu(2);
	return 0;
}


Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。 Quartz的优势: 1、Quartz是一个任务调度框架(库),它几乎可以集成到任何应用系统中。 2、Quartz是非常灵活的,它让您能够以最“自然”的方式来编写您的项目的代码,实现您所期望的行为 3、Quartz是非常轻量级的,只需要非常少的配置 —— 它实际上可以被跳出框架来使用,如果你的需求是一些相对基本的简单的需求的话。 4、Quartz具有容错机制,并且可以在重启服务的时候持久化(”记忆”)你的定时任务,你的任务也不会丢失。 5、可以通过Quartz,封装成自己的分布式任务调度,实现强大的功能,成为自己的产品。6、有很多的互联网公司也都在使用Quartz。比如美团 Spring是一个很优秀的框架,它无缝的集成了Quartz,简单方便的让企业级应用更好的使用Quartz进行任务的调度。   课程说明:在我们的日常开发中,各种大型系统的开发少不了任务调度,简单的单机任务调度已经满足不了我们的系统需求,复杂的任务会让程序猿头疼, 所以急需一套专门的框架帮助我们去管理定时任务,并且可以在多台机器去执行我们的任务,还要可以管理我们的分布式定时任务。本课程从Quartz框架讲起,由浅到深,从使用到结构分析,再到源码分析,深入解析Quartz、Spring+Quartz,并且会讲解相关原理, 让大家充分的理解这个框架和框架的设计思想。由于互联网的复杂性,为了满足我们特定的需求,需要对Spring+Quartz进行二次开发,整个二次开发过程都会进行讲解。Spring被用在了越来越多的项目中, Quartz也被公认为是比较好用的定时器设置工具,学完这个课程后,不仅仅可以熟练掌握分布式定时任务,还可以深入理解大型框架的设计思想。
[入门数据分析的第一堂课]这是一门为数据分析小白量身打造的课程,你从网络或者公众号收集到很多关于数据分析的知识,但是它们零散不成体系,所以第一堂课首要目标是为你介绍:Ø  什么是数据分析-知其然才知其所以然Ø  为什么要学数据分析-有目标才有动力Ø  数据分析的学习路线-有方向走得更快Ø  数据分析的模型-分析之道,快速形成分析思路Ø  应用案例及场景-分析之术,掌握分析方法[哪些同学适合学习这门课程]想要转行做数据分析师的,零基础亦可工作中需要数据分析技能的,例如运营、产品等对数据分析感兴趣,想要更多了解的[你的收获]n  会为你介绍数据分析的基本情况,为你展现数据分析的全貌。让你清楚知道自己该如何在数据分析地图上行走n  会为你介绍数据分析的分析方法和模型。这部分是讲数据分析的道,只有学会底层逻辑,能够在面对问题时有自己的想法,才能够下一步采取行动n  会为你介绍数据分析的数据处理和常用分析方法。这篇是讲数据分析的术,先有道,后而用术来实现你的想法,得出最终的结论。n  会为你介绍数据分析的应用。学到这里,你对数据分析已经有了初步的认识,并通过一些案例为你展现真实的应用。[专享增值服务]1:一对一答疑         关于课程问题可以通过微信直接询问老师,获得老师的一对一答疑2:转行问题解答         在转行的过程中的相关问题都可以询问老师,可获得一对一咨询机会3:打包资料分享         15本数据分析相关的电子书,一次获得终身学习
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值