HDU 畅通工程系列
畅通工程系列都是比较裸的最小生成树问题,且是中文题目,不赘述了。
1、HDU 1863 畅通工程
题意:一个省有很多村庄,其中一些之间是可以建公路的,每条公路都需要不同的代价,问代价最小的情况下将所有村庄都连通。
解法:裸的最小生成树。
tag:MST
由于才学MST,两种算法一个写了一遍:
Kruskal:
/*
* Author: Plumrain
* Created Time: 2013-11-30 10:21
* File Name: G-HDU-1863.cpp
*/
#include <iostream>
#include <cstdio>
#include <algorithm> using namespace std; typedef pair<int, int> pii;
struct Pat{
int s, e, w;
}; int n, m, f[];
Pat p[]; bool cmp(Pat a, Pat b)
{
return a.w < b.w;
} void init()
{
for (int i = ; i < n; ++ i){
scanf ("%d%d%d", &p[i].s, &p[i].e, &p[i].w);
-- p[i].s; --p[i].e;
}
} int find(int x)
{
if (x != f[x]) f[x] = find(f[x]);
return f[x];
} int kruskal(int n, int m)
{
sort(p, p+m, cmp);
for (int i = ; i < n; ++ i)
f[i] = i;
int cost = ;
for (int i = ; i < m; ++ i){
int s = p[i].s, e = p[i].e;
int t1 = find(s), t2 = find(e);
if (t1 != t2){
f[t1] = t2;
cost += p[i].w;
}
} int tmp = find();
for (int i = ; i < n; ++ i){
find (i);
if (f[i] != tmp) return -;
}
return cost;
} int main()
{
while (scanf ("%d%d", &n, &m) != EOF && n){
init();
int ans = kruskal(m, n);
if (ans == -) printf ("?\n");
else printf ("%d\n", ans);
}
return ;
}
Prim:
/*
* Author: Plumrain
* Created Time: 2013-11-30 10:51
* File Name: G-HDU-1863.cpp
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
#include <utility> using namespace std; #define CLR(x) memset(x, 0, sizeof(x))
#define PB push_back
const int maxint = ;
typedef pair<int, int> pii; int n, m;
bool v[];
int c[];
vector<pii> p[]; struct cmp{
bool operator() (pii a, pii b){
return a.second > b.second;
}
}; void init()
{
for (int i = ; i < n; ++ i)
p[i].clear(); int a, b, w;
for (int i = ; i < m; ++ i){
scanf ("%d%d%d", &a, &b, &w);
-- a; -- b;
p[a].PB (make_pair(b, w));
p[b].PB (make_pair(a, w));
}
} int prim(int n, int m)
{
int cost = ;
CLR (v);
priority_queue<pii, vector<pii>, cmp> q;
while (!q.empty()) q.pop(); for (int i = ; i < n; ++ i)
c[i] = maxint - ;
c[] = ;
v[] = ;
for (int i = ; i < (int)p[].size(); ++ i){
pii tmp = p[][i];
c[tmp.first] = tmp.second;
q.push (make_pair(tmp.first, tmp.second));
} for (int i = ; i < n-; ++ i){
if (q.empty()) break;
pii tmp = q.top(); q.pop();
while (v[tmp.first] && !q.empty()){
tmp = q.top(); q.pop();
}
if (v[tmp.first]) break; int t1 = tmp.first, t2 = tmp.second;
cost += t2;
v[t1] = ;
c[t1] = ;
for (int j = ; j < (int)p[t1].size(); ++ j) if (!v[p[t1][j].first]){
pii t = p[t1][j];
if (c[t.first] > t.second){
q.push (make_pair(t.first, t.second));
c[t.first] = t.second;
}
}
} for (int i = ; i < n; ++ i)
if (!v[i]) return -;
return cost;
} int main()
{
while (scanf ("%d%d", &m, &n) != EOF && m){
init();
int ans = prim(n, m);
if (ans == -) printf ("?\n");
else printf ("%d\n", ans);
}
return ;
}
2、HDU 1875 畅通工程再续
没写代码。
3、HDU 1879 继续畅通工程
用Kruskal写了一份:
/*
* Author: Plumrain
* Created Time: 2013-12-01 02:52
* File Name: G-HDU-1879.cpp
*/
#include <iostream>
#include <cstdio>
#include <algorithm> using namespace std; struct Pat{
int s, e, w;
}; int n, all, f[];
Pat p[]; bool cmp(Pat a, Pat b)
{
return a.w < b.w;
} int find (int x)
{
if (x != f[x]) f[x] = find(f[x]);
return f[x];
} void init()
{
all = ;
for (int i = ; i < n; ++ i)
f[i] = i; int s, e, w, x;
for (int i = ; i < n*(n-)/; ++ i){
scanf ("%d%d%d%d", &s, &e, &w, &x);
-- s; -- e;
if (x == ){
int t1 = find(s), t2 = find(e);
if (t1 != t2) f[t1] = t2;
}
else{
p[all].s = s; p[all].e = e;
p[all++].w = w;
}
}
} int kruskal()
{
int cost = ;
sort(p, p+all, cmp);
for (int i = ; i < all; ++ i){
int s = p[i].s, e = p[i].e, w = p[i].w;
int t1 = find(s), t2 = find(e);
if (t1 != t2){
f[t1] = t2; cost += w;
}
}
return cost;
} int main()
{
while (scanf ("%d", &n) != EOF && n){
init();
int ans = kruskal();
printf ("%d\n", ans);
}
return ;
}
4、HDU 1233 还是畅通工程
用Prim写了一份:
/*
* Author: Plumrain
* Created Time: 2013-12-02 01:43
* File Name: G-HDU-1233.cpp
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <utility> using namespace std; #define CLR(x) memset(x, 0, sizeof(x))
#define CLR1(x) memset(x, -1, sizeof(x))
#define PB push_back
typedef pair<int, int> pii; int n, m, d[];
bool v[];
vector<pii> pat[]; struct cmp{
bool operator() (pii a, pii b){
return a.second > b.second;
}
}; void init()
{
for (int i = ; i < n; ++ i)
pat[i].clear(); m = n * (n-) / ;
int a, b, w;
for (int i = ; i < m; ++ i){
scanf ("%d%d%d", &a, &b, &w);
-- a; -- b;
pat[a].PB (make_pair(b, w));
pat[b].PB (make_pair(a, w));
}
} int Prim(int n, int m)
{
priority_queue<pii, vector<pii>, cmp> q;
while (!q.empty()) q.pop(); int cost = ;
CLR1 (d);
CLR (v); v[] = ; d[] = ;
int t_sz = pat[].size();
for (int i = ; i < t_sz; ++ i){
pii tmp = pat[][i];
d[tmp.first] = tmp.second;
q.push (tmp);
} for (int i = ; i < n-; ++ i){
if (q.empty()) break;
pii tmp = q.top(); q.pop();
while (v[tmp.first] && !q.empty()){
tmp = q.top(); q.pop();
}
if (v[tmp.first]) break; int t1 = tmp.first, t2 = tmp.second;
cost += t2; v[t1] = ; d[t1] = ;
int sz = pat[t1].size();
for (int j = ; j < sz; ++ j) if (!v[pat[t1][j].first]){
pii tt = pat[t1][j];
if (d[tt.first] > tt.second){
q.push (make_pair(tt.first, tt.second));
d[tt.first] = tt.second;
}
}
} for (int i = ; i < n; ++ i)
if (!v[i]) return -;
return cost;
} int main()
{
while (scanf ("%d", &n) != EOF && n){
init();
int ans = Prim(n, m);
printf ("%d\n", ans);
}
return ;
}
HDU 畅通工程系列的更多相关文章
- hdu 畅通工程系列题目
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1232 并查集水. #include <stdio.h> #include <iost ...
- hdu畅通工程(并查集)
Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道 ...
- hdu畅通工程
传送门 畅通工程 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- hdu 畅通工程再续
http://acm.hdu.edu.cn/showproblem.php?pid=1875 #include <cstdio> #include <cstring> #inc ...
- hdu 畅通工程
http://acm.hdu.edu.cn/showproblem.php?pid=1863 #include <cstdio> #include <cstring> #inc ...
- hdu 畅通工程续
算法:多源最短路(floyd) 题意:有多个城镇,有些之间有通路,给你起点和终点,输出最短路径: Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路 ...
- hdu 1875 畅通工程再续(prim方法求得最小生成树)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1875 /************************************************* ...
- hdu 1874 畅通工程续(求最短距离,dijkstra,floyd)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1874 /************************************************* ...
- ACM: HDU 1874 畅通工程续-Dijkstra算法
HDU 1874 畅通工程续 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Desc ...
随机推荐
- sqlserver时间字符串的截取
昨天同学问了个sqlserver的问题,写了个简单的示例,如下: 问题:“15:00-16:30”拆分成“15:00-15:30”.“15:30-16:00”.“16:00-16:30”? 代码: d ...
- ArrayList 类和List<T>泛型类
ArrayList集合类在System.Colletions命名空间下,它其实是一个特殊的数组,它可以动态的添加和删除元素,根据元素的改变自动决定它自身的大小,也可以灵活的插入元素等操作,使用起来要比 ...
- 【转】UILabel、UITextView自适应得到高度
原文:http://blog.csdn.net/xcysuccess3/article/details/8331549 在iOS中,经常遇到需要根据字符串的内容动态指定UILabel,UITextVi ...
- Spring_DI利用set方法赋值Demo
Person.java public class Person { private Long pid; private String pname; private Student student; p ...
- java数据类型学习
java数据类型基本分为两类: 一类为基本数据类型: 数值类型: 整数类型:byte.short.int.long 浮点类型:float.double 字符类型:char 布尔类型:boolean 一 ...
- 一句实现jquery导航栏
/*mine 才疏学浅,望大神绕行 */ .current{ color: red; font-size: large; } $(function(){ //实现点击标题的css和.lev1下面的a标 ...
- Android Context作用
Context 用于访问全局信息的接口 App的资源: strings, drawable资源等等 工程代码:LearnContext.zip ---------------------------- ...
- asp.net 导入
开发项目过程中会遇到各种各样的项目需求,我现在遇到的问题是每个部门有不同的excel文件类型,他们每个部门每个文件类型上传成功之后都会在数据库中产生表,表的列名是你excel第一行数据,其他行作为表的 ...
- jquery如何判断div是否隐藏--useful
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Java中的自动拆箱装箱(Autoboxing&Unboxing)
一.基本类型打包器 1.基本类型:long.int.double.float.boolean 2.类类型:Long.Integer.Double.Float.Boolean 区别:基本类型效率更高,类 ...