MST:Bad Cowtractors(POJ 2377)
2015-11-11 14:20
393 查看
坏的牛圈建筑
题目大意:就是现在农夫又要牛修建牛栏了,但是农夫想不给钱,于是牛就想设计一个最大的花费的牛圈给他,牛圈的修理费用主要是用在连接牛圈上
这一题很简单了,就是找最大生成树,把Kruskal算法改一下符号就好了,把边从大到小排列,然后最后再判断是否联通(只要找到他们的根节点是否相同就可以了!)
#include <iostream> #include <algorithm> #include <functional> #define MAX_N 1005 #define MAX 20005 using namespace std; typedef int Position; typedef struct _edge { Position from; Position to; int cost; }Edge_Set; int fcomp(const void *a, const void *b) { return (*(Edge_Set *)b).cost - (*(Edge_Set *)a).cost; } static Edge_Set edge[MAX]; static Position Set[MAX_N]; Position Find(Position); void Union(Position, Position); void Kruskal(const int, const int); bool Is_Connected(const int); int main(void) { int Node_Sum, Path_Sum, cost; Position tmp_from, tmp_to; while (~scanf("%d%d", &Node_Sum, &Path_Sum)) { for (int i = 0; i < Path_Sum; i++)//读入边 { scanf("%d%d%d", &tmp_from, &tmp_to, &cost); edge[i].from = tmp_from; edge[i].to = tmp_to; edge[i].cost = cost; } qsort(edge, Path_Sum, sizeof(Edge_Set), fcomp); Kruskal(Node_Sum, Path_Sum); } return 0; } Position Find(Position x) { if (Set[x] < 0) return x; else return Set[x] = Find(Set[x]); } void Union(Position px, Position py) { if (Set[px] < Set[py]) { Set[px] += Set[py]; Set[py] = px; } else { Set[py] += Set[px]; Set[px] = py; } } bool Is_Connected(const int Node_Sum) { Position p_u, p_tmp; p_u = Find(1); for (int i = 2; i <= Node_Sum; i++) { p_tmp = Find(i); if (p_u != p_tmp) return false; } return true; } void Kruskal(const int Node_Sum, const int Path_Sum) { Position px, py, from, to; long long ans = 0; fill(Set, Set + Node_Sum + 1, -1); for (int i = 0; i < Path_Sum; i++) { from = edge[i].from; to = edge[i].to; px = Find(from); py = Find(to); if (px != py) { ans += edge[i].cost; Union(px, py); } } if (Is_Connected(Node_Sum)) printf("%lld\n", ans); else printf("-1\n"); }
相关文章推荐
- JavaScript基本概念(下)
- Python基于pygame实现的font游戏字体(附源码)
- jQuery插件markitup轻量级的文本编辑器
- sed ‘1!G;h;$!d’ 解析——将行逆序输出
- java反射详解
- 判断一个未知对象是否为空
- Python中的字典
- arcgis for android: file:/mnt/sdcard/xxx.geodatabase does not exist.
- Spring Mina 中文文档 用户手册
- Linux命令提示符如何按照自己的习惯修改?
- Android底部菜单栏、Android沉浸式状态栏(顶部状态栏修改颜色)、自定义标题栏
- 90001---浅谈Java中的Serializable
- JAVA——类与JAVA文件
- android app如何接受input event (1)
- 海量数据处理
- git 学习笔记
- 2014年最新前端开发面试题(转自markyun)
- sicily 1433. Optimal Parking
- android jni的一些总结
- 同学作业