HDU1233(Kruskal&Prim两解)
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 Huge input, scanf is recommended.
//Kruskal
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
const int maxn=;
#define ms(x,n) memset(x,n,sizeof x);
const int inf=0x3f3f3f3f;
using namespace std;
int n,m;
int u,v,w,parent[maxn];//ranks[maxn];
struct node
{
int u,v,w;
node(){u=,v=,w=inf;}
//node(int uu,int vv,int ww){u=uu,v=vv,w=ww;}
}edge[maxn*maxn];
bool cmp(node a,node b)
{
return a.w<b.w;
}
int init(int n)
{
for(int i=;i<=n;i++)
parent[i]=-;//,ranks[i]=-1;
}
int finds(int x)
{
if(parent[x]<) return x;
return parent[x]=finds(parent[x]);
}
void unions(int x,int y)
{
x=finds(x),y=finds(y);
if(x==y) return;
if(parent[x]<parent[y])
{
parent[x]+=parent[y];
parent[y]=x;
}
else
{
parent[y]+=parent[x];
parent[x]=y;
}
}
int kruskal()
{
sort(edge+,edge+m+,cmp);
init(n);
int ans=;
for(int i=;i<=m;i++)
{
node a=edge[i];
if(finds(a.u)!=finds(a.v))
{
unions(a.u,a.v);
ans+=a.w;
}
}
return ans;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie();
while(~scanf("%d",&n),n)
{
m=n*(n-)/;
for(int i=;i<=m;i++)
edge[i]=node();
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&edge[i].u,&edge[i].v,&w);
edge[i].w=min(edge[i].w,w);
}
printf("%d\n",kruskal());
}
return ;
}
//Prim
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#define ms(x,n) memset(x,n,sizeof x);
const int maxn=;
const int inf=0x3f3f3f3f;
using namespace std;
int d[maxn],g[maxn][maxn];
int n;
bool vis[maxn];
void prim()
{
int i,j,k,tmp,ans=;
ms(d,0x3f);
ms(vis,);
d[]=;
for(i=;i<=n;i++)
{
tmp=inf;
for(j=;j<=n;j++)
{
if(!vis[j]&&tmp>d[j])
{
tmp=d[j];
k=j;
}
}
vis[k]=;
ans+=tmp;
for(j=;j<=n;j++)
{
if(!vis[j]&&d[j]>g[k][j])
d[j]=g[k][j];
}
}
cout<<ans<<endl;
}
int main()
{
while(~scanf("%d",&n),n)
{
int m=n*(n-)/;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(i!=j)
g[i][j]=inf;
else
g[i][j]=;
for(int i=;i<=m;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
g[u][v]=g[v][u]=w;
}
prim();
}
return ;
}
HDU1233(Kruskal&Prim两解)的更多相关文章
- hdu1233 最小生成树Prim算法和Kruskal算法
Prim算法 时间复杂度:O(\(N^2\),N为结点数) 说明:先任意找一个点标记,然后每次找一条最短的两端分别为标记和未标记的边加进来,再把未标记的点标记上.即每次加入一条合法的最短的边,每次扩展 ...
- POJ1251 Jungle Roads (最小生成树&Kruskal&Prim)题解
题意: 输入n,然后接下来有n-1行表示边的加边的权值情况.如A 2 B 12 I 25 表示A有两个邻点,B和I,A-B权值是12,A-I权值是25.求连接这棵树的最小权值. 思路: 一开始是在做莫 ...
- 最小生成树(Kruskal+Prim)--模板
最小生成树-----在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树. 应用场景 1.假设以下情景,有一块木板,板上钉上了一些钉子,这些钉子可以由一些细绳连接起来.假设每个钉子可以通 ...
- 最小生成树模板【kruskal & prim】
CDOJ 1966 Kruskal 解法 时间复杂度O(mlogm) m为边数,这里主要是边排序占时间,后面并查集还好 #include <cstdio> #include <cst ...
- uva 10034 Freckles (kruskal||prim)
题目上仅仅给的坐标,没有给出来边的长度,不管是prim算法还是kruskal算法我们都须要知道边的长度来操作. 这道题是浮点数,也没啥大的差别,处理一下就能够了. 有关这两个算法的介绍前面我已经写过了 ...
- 洛谷P3366【模板】最小生成树-克鲁斯卡尔Kruskal算法详解附赠习题
链接 题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入输出格式 输入格式: 第一行包含两个整数N.M,表示该图共有N个结点和M条无向边.(N<=5000,M&l ...
- 最小生成树算法总结(Kruskal,Prim)
今天复习最小生成树算法. 最小生成树指的是在一个图中选择n-1条边将所有n个顶点连起来,且n-1条边的权值之和最小.形象一点说就是找出一条路线遍历完所有点,不能形成回路且总路程最短. Kurskal算 ...
- 继续畅通工程(kruskal prim)
kruskal算法 #include <cstdio > #include <algorithm> using namespace std; const int MaxSi ...
- 算法笔记_066:Kruskal算法详解(Java)
目录 1 问题描述 2 解决方案 2.1 构造最小生成树示例 2.2 伪码及时间效率分析 2.3 具体编码(最佳时间效率) 1 问题描述 何为Kruskal算法? 该算法功能:求取加权连通图的最小 ...
随机推荐
- 【Java深入研究】6、CGLib动态代理机制详解
一.首先说一下JDK中的动态代理: JDK中的动态代理是通过反射类Proxy以及InvocationHandler回调接口实现的 但是,JDK中所要进行动态代理的类必须要实现一个接口,也就是说只能对该 ...
- Matlab disp()
matlab中disp()就是屏幕输出函数,类似于c语言中的printf()函数
- 使用git连接本地和远程github
使用git连接本地和远程github 网上很多github的流程比较乱,自己尝试整理了一下,主要是步骤较为清晰,如果有不清楚的可详细进行搜索对比 1. 申请和设置github https://gith ...
- OSX系统下配置Apache+PHP+MySQL+Navicat
概述 OSX系统对于PHP运行非常友好,我们只需要进行简单的配置便可以开始进行使用,本篇文章将一步一步地介绍Apache.PHP和MySQL的安装与配置,为开始进行开发铺好路 Apache 启动Apa ...
- Python全栈学习_day011作业
1,写函数,传入n个数,返回字典{‘max’:最大值,’min’:最小值}例如:min_max(2,5,7,8,4) 返回:{‘max’:8,’min’:2}(此题用到max(),min()内置函数) ...
- window的Navigator 对象
Navigator 对象包含有关浏览器的信息. Navigator 对象属性 document.write("浏览器的代码名:" + navigator.appCodeName + ...
- Linux 学习笔记之超详细基础linux命令 Part 1
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 说明:主要是在REHL Server 6操作系统下进行的测试 --字符界面虚拟终端与图形界面之间的切 方法:[ ...
- java中传值方式的个人理解
前言 这几天在整理java基础知识方面的内容,对于值传递还不是特别理解,于是查阅了一些资料和网上相关博客,自己进行了归纳总结,最后将其整理成了一篇博客. 值传递 值传递是指在调用函数时将实际参数复制一 ...
- Python 文档学习
1.在命令行执行Python脚本(获取输入) import sys print(sys.argv[1]) 2.compile Python(编译Python) 编译后,生成的文件是.pyc,但是要知道 ...
- [20180503]珅与分隔符.txt
[20180503]珅与分隔符.txt --//今天再次遇到分隔符问题,以前也遇到过做一次,链接.http://blog.itpub.net/267265/viewspace-763696/--//这 ...