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

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. PHP环境搭建所遇到的问题

    下午学校的机房搭建PHP组合包appserv开发环境的时候是没有任何问题的,但是到了自己的电脑上以后下砸的32位appserve一直无法正常由浏览器的localhos或者127.0.0.1 进入其ap ...

  2. Alljoyn 概述(2)

    AllJoyn 基本概念 • 总线(Bus) – 实现P2P通信的基础 – AllJoyn 的底层协议类似于D-Bus,相当于是跨设备分布式的 D-Bus • 总线附件(Bus Attachment) ...

  3. iOS socket编程

    // // ViewController.m // socket // // Created by emerys on 16/3/2. // Copyright © 2016年 Emerys. All ...

  4. javascript基础学习(六)

    javascript之对象 学习要点: 对象的属性和方法 对象的原型 一.对象 对象其实就是一种引用类型,而对象的值就是引用对象的实例. 二.创建对象 在javascript中有两种对象,一种是系统内 ...

  5. node-http-proxy修改响应结果

    最近在项目中使用node-http-proxy遇到需要修改代理服务器响应结果需求,该库已提供修改响应格式为html的方案:Harmon,而项目中返回格式统一为json,使用它感觉太笨重了,所以自己写了 ...

  6. Tomcat设置最佳线程数总结

    最佳线程数: 性能压测的情况下,起初随着用户数的增加,QPS会上升,当到了一定的阀值之后,用户数量增加QPS并不会增加,或者增加不明显,同时请求的响应时间却大幅增加.这个阀值我们认为是最佳线程数. 为 ...

  7. hdoj 4310 贪心

    不知为毛,过不了 我的代码: #include<stdio.h> int main(){ int n,a[30],b[30],temp,i,j,s1,s2; double c[30]; w ...

  8. HDU 3359 Kind of a Blur(高斯消元)

    题意: H * W (W,H <= 10) 的矩阵A的某个元素A[i][j],从它出发到其他点的曼哈顿距离小于等于D的所有值的和S[i][j]除上可达点的数目,构成了矩阵B.给定矩阵B,求矩阵A ...

  9. MySql数据库1【概念】

    [mysql] mysql是目前最主流的跨平台.开放源代码的关系型数据库,由瑞曲的mysql ab公司开发,已经被SUN公司收购,标识是一只名为sakila的海豚,代表mysql的速度.能力.精确优秀 ...

  10. phpcms 如何获取文章

    请求地址http://127.0.0.1/phpcms/index.php?m=content&c=index&a=show&catid=6&id=8 先来判断地址对应 ...