hdoj1863 畅通工程(Prime || Kruskal)
题目链接
http://acm.hdu.edu.cn/showproblem.php?pid=1863
思路
最小生成树问题,使用Prime算法或者Kruskal算法解决。这题在hdoj1233的基础上增加了判断是否能形成最小生成树的要求。
代码
Prime算法:
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std; const int INF = 0x7fffffff;
const int N = + ;
int map[N][N];
int dist[N];
int n, m; void prime()
{
int min_edge, min_node;
for (int i = ; i <= m; i++)
dist[i] = INF;
int ans = ;
int now = ;
for (int i = ; i < m; i++)
{
dist[now] = -;
min_edge = INF;
for (int j = ; j <= m; j++)
{
if (j != now && dist[j] >= )
{
if (map[now][j] > )
dist[j] = min(dist[j], map[now][j]);
if (dist[j] < min_edge)
{
min_edge = dist[j]; //min_edge存储与当前结点相连的最短的边
min_node = j;
}
}
}
if (min_edge == INF) //不能形成最小生成树
{
puts("?");
return;
}
ans += min_edge;
now = min_node;
}
printf("%d\n", ans);
} int main()
{
//freopen("hdoj1863.txt", "r", stdin);
while (scanf("%d%d", &n, &m) == && n)
{
memset(map, , sizeof(map));
int a, b, d;
for (int i = ; i < n; i++)
{
scanf("%d%d%d", &a, &b, &d);
map[a][b] = map[b][a] = d;
}
prime();
}
return ;
}
Kruskal算法:
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>
using namespace std; struct Edge
{
int a, b, dist; Edge() {}
Edge(int a, int b, int d):a(a),b(b),dist(d){}
bool operator < (Edge edge)
{
return dist < edge.dist;
}
}; const int N = + ;
vector<Edge> v;
int p[N];
int n, m; int find_root(int x)
{
if (p[x] == -)
return x;
else return find_root(p[x]);
} void kruskal()
{
memset(p, -, sizeof(p));
sort(v.begin(), v.end()); //将边按边长从短到长排序
int ans = ;
for (int i = ; i < v.size(); i++)
{
int ra = find_root(v[i].a);
int rb = find_root(v[i].b);
if (ra != rb)
{
ans += v[i].dist;
p[ra] = rb;
}
} int cnt = ;
for (int i = ; i <= m; i++)
if (p[i] == -) cnt++;
if (cnt > ) //连通分量个数多于1个,不能形成最小生成树
{
puts("?");
return;
}
printf("%d\n", ans);
} int main()
{
//freopen("hdoj1863.txt", "r", stdin);
while (scanf("%d%d", &n, &m) == && n)
{
v.clear();
int a, b, d;
for (int i = ; i < n; i++)
{
scanf("%d%d%d", &a, &b, &d);
v.push_back(Edge(a, b, d));
}
kruskal();
}
return ;
}
hdoj1863 畅通工程(Prime || Kruskal)的更多相关文章
- HDU 1233 还是畅通工程(Kruskal算法)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1233 还是畅通工程 Time Limit: 4000/2000 MS (Java/Others) ...
- HDU 1875 畅通工程再续(kruskal)
畅通工程再续 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- HDU 1232 畅通工程(Kruskal)
畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- 畅通工程(kruskal算法)
个人心得:日了狗,WR了俩个小时才发现是少了个vector清理,我也是醉了,不过后面还是对这个有了更好得了解,一是我得算法,而是学长改进 后的算法,改进后得算法还要判断所有村庄是否在连在一起,其实我觉 ...
- 继续畅通工程(kruskal prim)
kruskal算法 #include <cstdio > #include <algorithm> using namespace std; const int MaxSi ...
- HDU 畅通工程系列
畅通工程系列都是比较裸的最小生成树问题,且是中文题目,不赘述了. 1.HDU 1863 畅通工程 题意:一个省有很多村庄,其中一些之间是可以建公路的,每条公路都需要不同的代价,问代价最小的情况下将所有 ...
- hdu1875 畅通工程再续 最小生成树并查集解决---kruskal
http://acm.hdu.edu.cn/showproblem.php?pid=1875 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的 ...
- HDU1875——畅通工程再续(最小生成树:Kruskal算法)
畅通工程再续 Description相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现.现在政府决定大力发展百岛湖,发展首先要解决的问题当 ...
- prime算法求最小生成树(畅通工程再续)
连着做了四道畅通工程的题,其实都是一个套路,转化为可以求最小生成树的形式求最小生成树即可 这道题需要注意: 1:因为满足路的长度在10到1000之间才能建路,所以不满足条件的路径长度可以初始化为无穷 ...
随机推荐
- gson转换对象为json字符串时对特殊字符编码的问题
使用google的gson进行object和json的转换,如下: public static String object2json(Object obj) { Gson gson = new Gso ...
- MacOS Sierra允许运行任何来源的程序
参考自http://bbs.feng.com/read-htm-tid-10584598.html Mac新系统 Sierra中默认已经看不到“任何来源”的选项,就无法安装很多的第三方程序,所以需要做 ...
- Java时间格式转换工具类
把当前时间修改成指定时间 //把当前时间修改成指定时间 public String dateUtil(Integer seconds, String dateFormatPattern){ Date ...
- python学习笔记3--set
#int string list tuple dict bool float set #集合:天生去重 s=set() #空的集合 s2={'} ls=[1,2,3,4,5,6,7,1,2,3,4] ...
- div+css+jQuery简单实现投票功能
昨天看到C#群里有人问一个投票功能如何实现... 我对此很感兴趣,为了练习一下,就有了以下代码. 投票功能使用jQuery实现..纯html代码...数据通过json字符串传递,通过 eval转换为j ...
- Java 图片转字节流 实现 图片->字节流(字符串)->图片
//该方法实现图片转String 参数为图片的路径 可以是file.toString()得到public String testUpload(String path) { try { String s ...
- 【leetcode 简单】 第七十七题 单词模式
给定一种 pattern(模式) 和一个字符串 str ,判断 str 是否遵循相同的模式. 这里的遵循指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非空单词之间存在着双向 ...
- 查看 CUDA cudnn 版本
cuda 版本 cat /usr/local/cuda/version.txt cudnn 版本 cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MA ...
- win10+anaconda虚拟环境python3.6+cuda9.0+cudnn7+pytorch0.4.1
anaconda下jupyter notebook的打开目录的修改:参考:https://www.cnblogs.com/amberdata/p/7907845.html pytorch官网:http ...
- node.js、git、bootstrap等安装配置
纯记录 一,安装node.js 1 官方网址 http://nodejs.org/ 点击install 下载node-v0.10.22-x86.msi 2 安装,修改安装目录到d盘,一路next,无 ...