ACM程序设计选修课——Problem E:(ds:图)公路村村通(优先队列或sort+克鲁斯卡尔+并查集优化)
畅通工程
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 24323 Accepted Submission(s): 10621
行对应村庄间道路的成本,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间道路的成本(也是正整数)。为简单起见,村庄从1到M编号。当N为0时,全部输入结束,相应的结果不要输出。
1 2 1
1 3 2
2 3 4
1 3
2 3 2
0 100
?
先引用百度百科
先构造一个只含 n 个顶点、而边集为空的子图,把子图中各个顶点看成各棵树上的根结点,之后,从网的边集 E 中选取一条权值最小的边,若该条边的两个顶点分属不同的树,则将其加入子图,即把两棵树合成一棵树,反之,若该条边的两个顶点已落在同一棵树上,则不可取,而应该取下一条权值最小的边再试之。依次类推,直到森林中只有一棵树,也即子图中含有
n-1 条边为止。
最后一句很重要,停止条件是子图中含有n-1条边为止。
还有就是选取每一条边的时候要看看是否能与之前已选中的构成回路,不构成回路则选择一条距离最短的,若能构成回路则舍弃。
嗯这题无聊玩了一下操作符重载(刚开始写反了输出的结果比较大。),比较有意思的。鉴于sort的复杂度不大两者应该没啥差别,就是不用vector的情况下空间可以节省一点……没错我就是这么无聊= =
sort写法:
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<sstream>
#include<cstring>
#include<cstdio>
#include<string>
#include<deque>
#include<stack>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#define INF 0x3f3f3f3f
#define MM(x) memset(x,0,sizeof(x))
using namespace std;
typedef long long LL;
const int N=1010;
struct info
{
int a;
int b;
int val;
info(){a=b=val=0;}
}; info G[3*N];
int vis[N]; void init()
{
MM(G);
for (int i=0; i<N; i++)
vis[i]=i;
}
bool cmp(const info &a,const info &b)
{
return a.val<b.val;
}
inline int find(int a)
{
if(vis[a]!=a)
return vis[a]=find(vis[a]);
return vis[a];
}
inline int merge(const int &a,const int &b)
{
int aa=find(a),bb=find(b);
if(aa!=bb)
{
vis[bb]=aa;
return 1;
}
return 0;
} int main(void)
{
int tcase,i,x,y,val,n,m;
scanf("%d",&tcase);
while (tcase--)
{
scanf("%d%d",&n,&m);
init();
int ans=0,cnt=0;
for (i=1; i<=m; i++)
{
scanf("%d%d%d",&G[i].a,&G[i].b,&G[i].val);
}
sort(G+1,G+m+1,cmp);
for (i=1; i<=m; i++)
{
if(cnt==n-1)
break;
if(merge(G[i].a,G[i].b))
{
cnt++;
ans+=G[i].val;
}
}
cnt==n-1?printf("%d\n",ans):puts("-1");
}
return 0;
}
优先队列写法:
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<sstream>
#include<cstring>
#include<cstdio>
#include<string>
#include<deque>
#include<stack>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#define INF 0x3f3f3f3f
#define MM(x) memset(x,0,sizeof(x))
using namespace std;
typedef long long LL;
const int N=1010; struct info
{
int a;
int b;
int val;
bool operator<(const info &b) const
{
return val>b.val;
}
}; info G;
int vis[N];
priority_queue<info> Q; void debug(priority_queue<info> q)
{
while (!q.empty())
{
cout<<q.top().a<<" "<<q.top().b<<endl;
q.pop();
}
} void init()
{
for (int i=0; i<N; i++)
{
vis[i]=i;
}
while (!Q.empty())
Q.pop();
}
inline int find(int a)
{
if(vis[a]!=a)
return vis[a]=find(vis[a]);
return vis[a];
}
inline bool merge(int a,int b)
{
int aa=find(a),bb=find(b);
if(aa!=bb)
{
vis[bb]=aa;
return true;
}
return false;
}
int main(void)
{
int tcase,i,j,x,y,val,n,m;
scanf("%d",&tcase);
while (tcase--)
{
scanf("%d%d",&n,&m);
init();
int ans=0,cnt=0;
for (i=0; i<m; i++)
{
scanf("%d%d%d",&G.a,&G.b,&G.val);
Q.push(G);
}
//debug(Q);
while (!Q.empty())
{
info t=Q.top();
Q.pop();
if(cnt==n-1)
break;
if(merge(t.a,t.b))
{
cnt++;
ans+=t.val;
}
}
cnt==n-1?printf("%d\n",ans):puts("-1");
}
return 0;
}
ACM程序设计选修课——Problem E:(ds:图)公路村村通(优先队列或sort+克鲁斯卡尔+并查集优化)的更多相关文章
- ACM程序设计选修课——Problem E:(ds:图)公路村村通(Prim)
问题 E: (ds:图)公路村村通 时间限制: 1 Sec 内存限制: 128 MB 提交: 9 解决: 5 题目描述 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本, ...
- ACM程序设计选修课——Problem F:(ds:图)旅游规划(优先队列+SPFA)
问题 F: (ds:图)旅游规划 时间限制: 1 Sec 内存限制: 128 MB 提交: 14 解决: 4 题目描述 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路 ...
- ACM程序设计选修课——Problem D: (ds:树)合并果子(最优二叉树赫夫曼算法)
Problem D: (ds:树)合并果子 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 80 Solved: 4 [Submit][Status][ ...
- pta08-图7 公路村村通 (30分)
08-图7 公路村村通 (30分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N ...
- pat06-图6. 公路村村通(30)
06-图6. 公路村村通(30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的 ...
- 7-6 公路村村通(30 分) 【prime】
7-6 公路村村通(30 分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤10 ...
- 7-10 公路村村通(30 分)(最小生成树Prim算法)
7-10 公路村村通(30 分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤1 ...
- PTA 7-1 公路村村通 (30分)
PTA 7-1 公路村村通 (30分) 现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N ...
- PTA 08-图7 公路村村通 (30分)
现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数NN(\le 1000≤1000)和候选道 ...
随机推荐
- 【UML】协作图Collaboration diagram(交互图)(转)
http://blog.csdn.net/sds15732622190/article/details/49402269 前言 学完UML时序图,就要看一下UML协作图,因为两张图是相 ...
- 使用Timer组件制作计时器
实现效果: 知识运用: Timer组件的interval属性 //获取或设置Timer组件Tick事件发生的时间间隔 public int Interval {get;set} NumericUpDo ...
- linux文本处理工具及正则表达式
cat命令:查看文本内容 cat [选项]... [文件]... -E 显示行结束符 -n 显示文本内容时显示行号 -A 显示所以控制符 -b 非空行编号 -s 压缩连 ...
- mac 使用homebrew 安装mysql
1. 安装homebrew ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)" brew update ...
- 【数学 思维题】HDU4473Exam
过程很美妙啊 Problem Description Rikka is a high school girl suffering seriously from Chūnibyō (the age of ...
- 201621123080《Java程序设计》第1周学习总结
作业01-Java基本概念 1. 本周学习总结 关键词: JDK.JAVA.编程.基础语法 概念之间的关系: JDK是JAVA的开发工具,学习JAVA的主要方法是大量编程,语法是JAVA的基础 2. ...
- Anaconda安装和环境的搭建
Anaconda安装 在官网上下载最新的Anaconda https://www.anaconda.com/distribution/ 我使用的是2018.12,Python 3.7这个版本的. 安装 ...
- LeetCode(287)Find the Duplicate Number
题目 Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), ...
- centos7 killall 命令
centos7精简安装后,使用中发现没有killall命令. 安装这个包即可: yum install psmisc
- CentOS 7 安装 配置 Nginx + PHP
. CentOS 7 下配置 yum 安装 Nginx. 进入/etc/yum.repos.d/目录下创建一个源配置文件nginx.repo: cd /etc/yum.repos.d/ vim ngi ...