还是畅通工程(prim和kruskal)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1233
还是畅通工程
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 62608 Accepted Submission(s): 28422
当N为0时,输入结束,该用例不被处理。
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
5
Hint
Huge input, scanf is recommended.
#include<iostream>
using namespace std;
const int maxn=+;
const int inf=1e9+;
int n;
int cost[maxn][maxn];//cost[i][j]两点之间的距离
int mincost[maxn];//从集合x出发到各点的最近距离
bool vis[maxn];//是否在本集合中
void Prim()
{
mincost[]=;//选定1为起点
int ans=;
while(true)
{
int flag=-;
for(int i=;i<=n;i++)
{
if(!vis[i]&&(flag==-||mincost[i]<mincost[flag]))
flag=i;
}
if(flag==-) break;
vis[flag]=true;
ans+=mincost[flag];
for(int i=;i<=n;i++)
mincost[i]=min(mincost[i],cost[flag][i]);//更新 }
cout<<ans<<endl;
}
int main()
{
while(cin>>n)
{
if(n==) break;
for(int i=;i<=n;i++)//初始化
{
for(int j=;j<=n;j++)
{
cost[i][j]=inf;
}
cost[i][i]=;
mincost[i]=inf;
vis[i]=false;
}
for(int i=;i<n*(n-)/;i++)
{
int u,v,w;
cin>>u>>v>>w;
cost[u][v]=w;
cost[v][u]=w; }
Prim();
}
}
Kruskal:
在整个图中找到一条 最小的 不会形成环 的边
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=100*100+5;
int fa[maxn];
int n;
struct Edge
{
int u,v,w;//起点 终点 边的权值
}edge[maxn];
bool cmp(const Edge a,const Edge b)//快排
{
return a.w<b.w;//按权值从小到大
}
int Get_fa(int x)//找父亲节点
{
if(fa[x]==x) return x;
return fa[x]=Get_fa(fa[x]);
}
void Kruskal()
{
for(int i=1;i<=n;i++) fa[i]=i; //刚开始每个节点的父亲都是自己,熟悉的并查集
int ans=0,cnt=1;//cnt从1开始 为什么呢? 因为n-1条边确定n个点
for(int i=0;i<n*(n-1)/2;i++) //遍历每一条边
{
int x=Get_fa(edge[i].u);
int y=Get_fa(edge[i].v);
int w=edge[i].w;
if(x!=y)//判断是否属于同一个集合
{
ans+=w;
fa[x]=y;
cnt++;
}
if(cnt==n)//n个村庄已经连接起来了
{
break;
//cout<<ans<<endl;
//return ;
}
}
cout<<ans<<endl;
}
int main()
{
while(cin>>n)
{
if(n==0) break;
for(int i=0;i<n*(n-1)/2;i++) cin>>edge[i].u>>edge[i].v>>edge[i].w;//输入边
sort(edge,edge+(n*(n-1)/2),cmp);//从小到大排序
Kruskal();
}
}
还是畅通工程(prim和kruskal)的更多相关文章
- hdu 1233 还是畅通工程 (prim, kruskal)
还是畅通工程Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- HDU 1879 继续畅通工程 (Prim(普里姆算法)+Kruskal(克鲁斯卡尔))
继续畅通工程 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- HDU-1233 还是畅通工程 (prim 算法求最小生成树)
prim 算法求最小生成树 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- hdu 1863 畅通工程 (prim)
畅通工程Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- 还是畅通工程,最小生成树kruskal
题目描述: 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可 ...
- 畅通工程再续 (kruskal算法的延续)
个人心得:这题其实跟上一题没什么区别,自己想办法把坐标啥的都给转换为对应的图形模样就好了 相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实 ...
- hdoj1879 继续畅通工程(Prime || Kruskal)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1879 思路 这题和hdoj1102很像,图中的有一些路已经修好了,对于这些已经修好的路,我们令还需要修 ...
- hdoj1863 畅通工程(Prime || Kruskal)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1863 思路 最小生成树问题,使用Prime算法或者Kruskal算法解决.这题在hdoj1233的基础 ...
- hdoj1233 还是畅通工程(Prime || Kruskal)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1233 思路 最小生成树问题,使用Prime算法或者Kruskal算法解决. 代码 Prime算法: # ...
- HDU 1879 继续畅通工程(Prim||Kruscal模板题)
原题链接 Prim(点归并) //异或运算:相同为假,不同为真 #include<cstdio> #include<algorithm> #define maxn 105 us ...
随机推荐
- bootstrap.js 文件使用指南
介绍 使用 Bootstrap v3.3.7 时,需要引入三个脚本文件. https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.m ...
- Markdown语法简介 | Markdown Tutorial
Markdown是一种轻量级标记语言,允许人们使用易读易写的纯文本格式编写文档,然后转换成有效的HTML文档. 与Word相比,使用Markdown最大的好处是可以使人们将注意力集中与文字本身而非排版 ...
- java获取Excel的导入
先准备好这2个架包 import java.io.*; import org.apache.commons.io.FileUtils; import org.apache.poi.hssf.userm ...
- windows10系统连接蓝牙鼠标自动断开解决方案
环境: Windows 10 企业版 2016 长期服务版 罗技M590 问题: 鼠标长时间未使用,会自动断开 解决步骤: 参考链接: https://zhidao.baidu.com/questio ...
- [raspberry pi3] 安装ffmpeg
买了个pi3,pi相对于通常的嵌入式系统的最大好处是里面夹带了gcc编译器,有很多东西都不需要交叉编译了. arm和pc的性能还是不能比的,io的瓶颈还是很明显的, 想要编的快点还是要在pc上交叉编译 ...
- Linux下管理员强行踢出用户的命令使用方法
Linux强制踢出用户命令: 一.输入w命令查看已登录用户信息 [root@KW_S01_192.168.1.106_A ~]# w 19:22:31 up 2:11, 3 users, loa ...
- C#修饰符讲解大全
1.修饰符是什么? 修饰符是用于限定类型以及类型成员的声明的一种符号.[百度百科] 2.修饰符分类 13种修饰符,按功能可分为三类:访问修饰符,类修饰符和成员修饰符.[百度百科] 作 用:限定类型以及 ...
- c++ 用new后delete,而继续输出指针后果 new/new[]/delete/delete[]区别
#include<iostream> #include<cstring> #include <string.h> int main(){ ]; ;i<;i++ ...
- spark(1) - ubuntu 下 spark 安装
简单步骤: 前提:hadoop 环境搭建(我的是伪分布式) 1.官网下载spark 2.spark部署(单机模式): (1)解压 (2)移动文件到自定义目录下(同时修改文件名-原来的名字太长) (3) ...
- [SinGuLaRiTy] KM算法
[SinGuLaRiTy-1018] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. Some Method Are Reproduced F ...