畅通工程系列都是比较裸的最小生成树问题,且是中文题目,不赘述了。

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 畅通工程系列的更多相关文章

  1. hdu 畅通工程系列题目

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1232 并查集水. #include <stdio.h> #include <iost ...

  2. hdu畅通工程(并查集)

    Problem Description 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇.省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道 ...

  3. hdu畅通工程

    传送门 畅通工程 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  4. hdu 畅通工程再续

    http://acm.hdu.edu.cn/showproblem.php?pid=1875 #include <cstdio> #include <cstring> #inc ...

  5. hdu 畅通工程

    http://acm.hdu.edu.cn/showproblem.php?pid=1863 #include <cstdio> #include <cstring> #inc ...

  6. hdu 畅通工程续

    算法:多源最短路(floyd) 题意:有多个城镇,有些之间有通路,给你起点和终点,输出最短路径: Problem Description 某省自从实行了很多年的畅通工程计划后,终于修建了很多路.不过路 ...

  7. hdu 1875 畅通工程再续(prim方法求得最小生成树)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1875 /************************************************* ...

  8. hdu 1874 畅通工程续(求最短距离,dijkstra,floyd)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1874 /************************************************* ...

  9. ACM: HDU 1874 畅通工程续-Dijkstra算法

    HDU 1874 畅通工程续 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Desc ...

随机推荐

  1. JAVA除去制定字符的方法

    只需调用replaceAll()方法: public class Test { public static void main(String[] args) { String s= "abc ...

  2. Windows的命令行怎么支持通配符

    摸索出一个小技巧,虽然Windows的命令行本身不支持通配符,但可以在脚本里把传进来的参数当通配符用 只要加上@ARGV = glob "@ARGV";就行了 @ARGV = gl ...

  3. 『重构--改善既有代码的设计』读书笔记----Self Encapsulate Field

    如果你直接访问一个字段,你就会和这个字段直接的耦合关系变得笨拙.也就是说当这个字段权限更改,或者名称更改之后你的客户端代码都需要做相应的改变,此时你可以为这个字段建立设值和取值函数并且只以这些函数来访 ...

  4. underscorejs-size学习

    2.24 size 2.24.1 语法: _.size(list) 2.24.2 说明: 返回列表的长度. 示例一:返回数组.对象.字符串的长度 //取数组的长度 var length length ...

  5. HTML5有语义的内联元素详解

    HTML5有语义的内联元素详解 time标签 time 元素表示一个时间值,比如 5:35 P.M., EST, April 23, 2007.例如: Example Source Code:< ...

  6. Extjs4.2.1学习笔记[更新]

    心血来潮准备学习一下Extjs,就从官方网站http://extjs.org.cn/下载了最新版本4.2.1,开始从头学习,记一下笔记,让自己能够持之以恒. 先说一下基本文件类库引用吧, 每个项目一开 ...

  7. PHP 开启 ssh2

    首先,为PHP安装SSH2扩展需要两个软件包, libssh2和ssh2(php pecl拓展). 两者的最新版本分别为libssh2-1.5.0.tar.gz和ssh2-0.12.tgz,下载地址分 ...

  8. [待续]Async in C# 1

    异步.异步是在.net .45里面提供的一个新的方法 它主要用在.三个方面 1.网络访问 2.磁盘访问 3.延迟很长时间的步骤 它主要有2个关键字 Async  Await Async  怎么工作 d ...

  9. MATLAB中多行注释的三种方法

    MATLAB中多行注释的三种方法 A. %{ 若干语句 %} B. 多行注释: 选中要注释的若干语句, 编辑器菜单Text->Comment, 或者快捷键Ctrl+R 取消注释: 选中要取消注释 ...

  10. java 对象序列化 RMI

    对于一个存在于Java虚拟机中的对象来说,其内部的状态只保持在内存中.JVM停止之后,这些状态就丢失了.在很多情况下,对象的内部状态是需要被持久化下来的.提到持久化,最直接的做法是保存到文件系统或是数 ...