`
Simone_chou
  • 浏览: 185480 次
  • 性别: Icon_minigender_2
  • 来自: 广州
社区版块
存档分类
最新评论

还是畅通工程(kruskal)

    博客分类:
  • HDOJ
 
阅读更多

还是畅通工程

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 20531    Accepted Submission(s): 9117

Problem Description
某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。
Input
测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N ( < 100 );随后的N(N-1)/2行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。
当N为0时,输入结束,该用例不被处理。
Output
对每个测试用例,在1行里输出最小的公路总长度。
Sample Input
3
1 2 1
1 3 2
2 3 4
4
1 2 1
1 3 4
1 4 1
2 3 3
2 4 2
3 4 5
0
Sample Output
3
5
Hint
Hint
Huge input, scanf is recommended.

     思路:kruskal算法的应用,求最小生成树。

 

     AC:

#include<cstdio>
#include<algorithm>
using namespace std;
typedef struct
{
	int from;
	int to;
	int len;
}road;

int cmp(road a,road b)
{
	return a.len<b.len;
}

road num[5000];
int root[105];

int find(int a)
{
	int x=a,temp;
//找根节点
	while(root[x]!=x)
	  x=root[x];
//压缩路径
	while(x!=a)
	  {
	  	temp=root[a];
	  	root[a]=x;
	  	a=temp;
	  }
	return x;
}

int main()
{
	int n;
	while(scanf("%d",&n)!=EOF)
	{
	    int sum=0;
	    if(n==0) break;
//初始化根节点
	    for(int i=1;i<=105;i++)
	       root[i]=i;
//输入边
	    for(int i=1;i<=(n*(n-1))/2;i++)
	       scanf("%d%d%d",&num[i].from,&num[i].to,&num[i].len);
//对边排序
	    sort(num+1,num+(n*(n-1))/2+1,cmp);
//排序后扫描边
	    for(int i=1;i<=(n*(n-1))/2;i++)
	     {
	    	int fa,fb;
	    	fa=find(num[i].from);
	    	fb=find(num[i].to);
//如果已经在一个连通图上,则放弃这条边
	    	if(fa==fb) continue;
//不在则合并顶点,总长加上这条边的权
	    	else
	    	{
	    		root[fa]=fb;
	    		sum+=num[i].len;
	    	}
	     }
//输出该边
	     printf("%d\n",sum);
	}
	return 0;
}
分享到:
评论

相关推荐

    Kruskal算法的c语言实现

    Kruskal算法,用C语言进行描述,有注释

    Kruskal算法python实现

    Kruskal算法python实现,包括无向图的绘制,需要自己在桌面上先建关于无向图的TXT

    代码 最小生成树kruskal算法离散型优化问题代码

    代码 最小生成树kruskal算法离散型优化问题代码代码 最小生成树kruskal算法离散型优化问题代码代码 最小生成树kruskal算法离散型优化问题代码代码 最小生成树kruskal算法离散型优化问题代码代码 最小生成树kruskal...

    用matlab编写的kruskal算法

    用matlab编写的kruskal算法,已编译

    Kruskal Stress Evaluation on Visualization

    输入mapping前后的数据,输出Kruskal Stress值,以及相应的图。Take points before and after mapping, then you'll get the Kruskal Stress factor and the figure.

    最小生成树的kruskal算法实现

    实现了kruskal的算法,测试可行。

    kruskal算法matlab

    最小生成树kruskal算法

    kruskal最小生成树实现

    c++编的kruskal法最小生成树的实现

    kruskal.py算法实现

    克鲁斯卡尔算法(即 Kruskal)的一种 Python 代码实现,这是最经典的一种图算法之一,对于图G(V,E),借助这个算法可以得到其最小生成树。

    邻接矩阵 Kruskal 算法

    邻接矩阵 Kruskal 算法的相关实现。代码完美可运行。

    算法导论中Kruskal算法

    《算法导论》之图论章节中最小生成树的Kruskal算法。

    Kruskal算法 最小生成树

    所以Kruskal算法的第一步是给所有的边按照从小到大的顺序排序。这一步可以直接使用库函数qsort或者sort。接下来从小到大依次考察每一条边(u,v)。 具体实现过程如下: &lt;1&gt; 设一个有n个顶点的连通网络为G(V,E)...

    Kruskal最小生成树算法

    对给定的图结构,实现求解最小生成树的Kruskal算法。每次在满足和已选边不构成回路的条件下选择一条权植最小的边,添加到新的生成数中。Kruskal算法的实现类似于计算连通枝的算法。它使用了分离集合数据结构以保持数...

    Kruskal算法

    Kruskal算法:使用Kruskal算法求解下面两图的最小生成树。 使用矩阵表示两图,输出最小生成树的点、边和权。

    用c实现的kruskal算法

    算法分析与设计中的kruskal算法!

    最小生成树Kruskal算法

    编写算法能够建立带权图,并能够用Kruskal算法求该图的最小生成树。最小生成树能够选择图上的任意一点做根结点。最小生成树输出采用顶点集合和边的集合的形式。

    Kruskal最短路径算法

    用Kruskal算法实现若干个城市之间的最短路径.最大城市数目为7个。

    KrusKal算法C实现

    用KrusKal算法求最小生成树问题。对一个带权无向图,求其最小生成树,本程序功能通过KrusKal算法实现。

    kruskal算法报告

    kruskal算法报告

    Kruskal算法.docx

    用R语言实现Kruskal算法,搜索图的最小生成树,并计算出权重,文件里有图例,有语言代码,复制即可运行,每个步骤有详细注释,并配有结果图

Global site tag (gtag.js) - Google Analytics