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

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. ubuntu桌面变空白,或者只有壁纸,任务栏消失的解决办法

    原因:因为打开了桌面特效的原因,但设置不合导致的. 解决方法:方法一:1.按住Ctrl+Alt+F1切换到字符终端下,输入用户名和密码登录2.输入以下命令删除出错的Compiz配置文件相关目录:rm ...

  2. ashx页面 “检测到有潜在危险的 Request.Form 值”的解决方法(控制单个处理程序不检测html标签)

    如题: 使用web.config的configuration/location节点. 在configuration节点内新建一个location节点,注意这个节点和system.webserver那些 ...

  3. 在window系统下配置login.sql

    在window系统下配置login.sql 他的位置是登录用户的文件夹,我的win7系统位置是: C:\Users\Administrator 我的login.sql下载地址: http://file ...

  4. 关于cocoapods和swift中使用oc第三方

    mac 系统自带ruby,使用cocoapods,直接安装cocoapods就行 终端:$ sudo gem install cocoapods {安装较慢是因为有墙,查看ruby镜像列表:$ gem ...

  5. Jmeter软件测试2--http接口测试

    上次利用Jmeter进行了webservice接口的测试,本次利用Jmeter进行http接口的测试 1.新建线程组 2.新建配置文件 3.新建http请求 4.配置动态请求 4.查看测试结果

  6. SGU 158.Commuter Train

    一道简单题. 火车停的位置不是在整点就是在二分之一点,坐标*2,然后枚举火车停的位置,计算总距离即可. code: #include <iostream> #include <cma ...

  7. centos 7 samba相关命令

    1.安装相关包 yum install samba samba-client samba-common 2.启动smb的命令 systemctl enable smb.service systemct ...

  8. JavaScript 获取当月天数

    getDate() 方法可返回月份的某一天.取值范围是1~31 如果是0的话,就返回最后一天.这样就能取得当月的天数了 比如获取16年2月份的天数 var day = new Date(2016,2, ...

  9. 极简主义,对逻辑操作符||和&&深度运用的理解

    丧心病狂的代码压缩好像违背了愉快阅读的本真,所以刨根问底想要了解个究竟,最后发现这不只是前端大牛装逼卖萌的绝技,也是代码洁癖爱好者的利器,毕竟这样看上去确实蛮优雅的; 一开始,我们接触到的代码是这样的 ...

  10. Bootstrap_Javascript_弹窗

    一. 结构分析 Bootstrap框架中的模态弹出框,分别运用了“modal”.“modal-dialog”和“modal-content”样式,而弹出窗真正的内容都放置在“modal-content ...