树的专题整理(二)

树的专题整理(二)

大家好,又见面了,我是全栈君。

    

 这一篇博客继续以一些OJ上的题目为载体,对树专题进行整理整理一下。

会陆续的更新。。。

这是树的专题整理的第二篇博客,假设第一篇博客的地址在:http://blog.csdn.net/hjd_love_zzt/article/details/29401743


例题:

1、POJ 2485

题目与分析:

这道题抽象一下:“是求最小生成树的最大边”


2)使用kruscal算法来解决

/*
 * POJ_2485_kruscal.cpp
 *
 *  Created on: 2014年6月11日
 *      Author: Administrator
 */

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

const int maxn = 505;
const int maxm = maxn*maxn;
const int inf = 9999999;

int map[maxn][maxn];
int father[maxn];
int find(int x) {
	if (x == father[x]) {
		return x;
	}

	father[x] = find(father[x]);
	return father[x];
}

void merge(int x, int y) {
	int fx = find(x);
	int fy = find(y);

	if (fx != fy) {
		father[fx] = fy;
	}
}


struct Edge{
	int begin;
	int end;
	int weight;
	int selected;
}edge[maxm];

bool cmp(Edge a,Edge b){
	if(a.weight != b.weight){
		return a.weight < b.weight;
	}

	if(a.begin < b.begin){
		return a.begin < b.begin;
	}

	return a.end < b.end;
}

int n,m;

int maxe;

int kruscal(){
	int sum = 0;

	int i;
	for(i = 1 ; i <= n ; ++i){
		father[i] = i;
	}

	sort(edge+1,edge+1+m,cmp);

	int k = 0;
	for(i = 1 ; i <= m ; ++i){
		if( k == n-1){
			break;
		}

		int x = find(edge[i].begin);
		int y = find(edge[i].end);
		if(x != y){
			merge(x,y);
			k++;
			edge[i].selected = true;

			sum += edge[i].weight;

			maxe = edge[i].weight;//用来记录最下生成树中当前的最大边
		}
	}

	return sum;
}


int main(){
	int t;
	scanf("%d",&t);

	while(t--){
		scanf("%d",&n);
		m = 1;

		int i;
		int j;
		for(i = 1 ; i <= n ; ++i){
			for(j = 1 ; j <= n ; ++j){
				scanf("%d",&map[i][j]);
			}
		}


		for(i = 1 ; i <= n ; ++i){
			for(j = i+1; j <= n ; ++j){
				edge[m].begin = i;
				edge[m].end = j;
				edge[m].weight = map[i][j];
				edge[m++].selected = false;
			}
		}

		kruscal();



		printf("%d\n",maxe);

	}

	return 0;
}












版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115547.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Android View 深度分析requestLayout、invalidate与postInvalidate「建议收藏」

    Android View 深度分析requestLayout、invalidate与postInvalidate「建议收藏」前言前几篇文章中,笔者对View的三大工作流程进行了详细分析,而这篇文章则详细讲述与三大工作流程密切相关的两个方法,分别是requestLayout和invalidate,如果对Viwe的三个工作流程不熟悉的读者,可以先看看前几篇文章,以便能更容易理解这篇文章的内容。

    2022年6月2日
    35
  • java二维数组试题_Java二维数组及习题总结

    java二维数组试题_Java二维数组及习题总结二维数组二维数组:就是一个由行和列组成的一个矩阵(Matrix);在这个矩阵中访问元素时,是根据元素的行角标和列角标所确定的。二维数组在内存中的存储:无论是二维数组,还是多维数组,它们本身就是一个一维数组,只不过该一维数组中的每一个元素是另一个一维数组。二维数组的创建:int[][]matrix=newint[3][4]———创建一个3行4列的二维数组,元素默认都是0;int[]…

    2022年5月29日
    41
  • WiFi安全漏洞KRACK深度解读

    WiFi安全漏洞KRACK深度解读前段时间爆出的WiFi安全漏洞KRACK,波及了全球的WLAN设备,无人幸免,也就是说wifi用户连接网络,不论是在公司,家里,还是咖啡馆,都有可能遭受攻击,问题时发现了一个,还有没有发现的,也许还更严重的问题,又该怎么办呢,如何规避协议层面的安全隐患,恐怕又是普通群众力所不及的。今天偶然看到一篇文章,文章对KRACK事件的技术缘由的进行了一番梳理剖析,纯技术系风格,看完后对此次爆出的安全漏洞有了

    2022年6月10日
    60
  • oracle insert select语句

    oracle insert select语句oracleinsertselect语句

    2022年7月17日
    23
  • datagrip 2021激活码【注册码】

    datagrip 2021激活码【注册码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月20日
    37
  • ArrayList遍历的三种方式[通俗易懂]

    ArrayList遍历的三种方式[通俗易懂]1publicclassArrayListTraversal{2publicvoidarrayListTraversal(List<Integer>lists){3/

    2022年7月4日
    29

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号