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 ...
随机推荐
- Mac下载并编译Google安卓AOSP项目代码
Mac下载并编译Google安卓AOSP项目代码 参考 https://source.android.com/source/index.html 这两天用Mac下载安卓AOSP源码,且把遇到的问题记下 ...
- java可变参数Varargs
http://www.cnblogs.com/shishm/archive/2012/01/31/2332656.html J2SE 1.5提供了“Varargs”机制.借助这一机制,可以定义能和多个 ...
- C# 多个线程一直跑着While(true)
在使用多线程的时候,开了多个线程一直在While(true),会造成CPU占用很高.这时候要在线程内加入一句Thread.Sleep(1),让他稍微睡一下.就不会消耗那么多CPU了. 代码: Thre ...
- javascript基础学习(四)
javascript之流程控制语句 学习要点: 表达式语句含义 选择语句:if.if...else.switch 循环语句:while.do...while.for.for...in 跳转语句:bre ...
- WebSocket基于javaweb+tomcat的简易demo程序
由于项目需要,前端向后台发起请求后,后台需要分成多个步骤进行相关操作,而且不能确定各步骤完成所需要的时间 倘若使用ajax重复访问后台以获取实时数据,显然不合适,无论是对客户端,还是服务端的资源很是浪 ...
- IBM服务器 IMM日志收集
在IBM X系列服务器背板上有一个" SYS MGMT"接口,用网线将此接口与笔记本连接起来,然后将笔记本的 IP地址配置成 192.168.70.0/24 这个网段的地址,然后 ...
- C++函数二义性问题,我怎么感觉编译器有偷懒嫌疑!!!
瞎扯一段,讲得不一定对.纯属学习! struct BB{ void a(){ cout << "bb's a()\n"; }}; struct B1 : public ...
- 我用Emacs,后来转向Vim——Vim学习之Vim键盘图(绝对值得珍藏)
Emacs本来就比较臃肿,麻烦.当我发现Vim键盘图时,我就渐渐转向Vim,追随Unix/Linux哲学去了.. 我用了Emacs三个月,因为它的学习曲线没Vim陡,这点吸引了,我使用Linux才7. ...
- CSAPP LAB: Buffer Overflow
这是CSAPP官网上的著名实验,通过注入汇编代码实现堆栈溢出攻击.实验材料可到我的github仓库 https://github.com/Cheukyin/CSAPP-LAB/ 选择buffer-ov ...
- 系统默认字体Mac OS,Windows,XP,Lunix
可查获的信息太少,目前得知的是以中文为例, OS : Helvetical,Lucida Grande(西文默认字体) Windows 7: Microsoft Yahei Xp : Simsun,T ...