ACM程序设计选修课——Problem E:(ds:图)公路村村通(Prim)
来源:互联网 发布:简约时尚的淘宝店铺名 编辑:程序博客网 时间:2024/05/17 23:18
问题 E: (ds:图)公路村村通
时间限制: 1 Sec 内存限制: 128 MB提交: 9 解决: 5
题目描述
现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。
输入
第一行为整数T,表示有T个case(测试实例)。
接下来每个case包含:
输入数据包括城镇数目正整数N(<=1000)和候选道路数目M(<=3N);随后的M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本。为简单起见,城镇从1到N编号。
输出
输出村村通需要的最低成本。如果输入数据不足以保证畅通,则输出-1,表示需要建设更多公路。
样例输入
36 151 2 51 3 31 4 71 5 41 6 22 3 42 4 62 5 22 6 63 4 63 5 13 6 14 5 104 6 85 6 33 12 3 25 41 2 12 3 23 1 34 5 4
样例输出
12-1-1
Prim算法对当前连通图的不断扩展,每次对扩展的头进行比较,对最小边权的那个点继续进行扩展,直到无法再扩展或所有点均被访问过。而优先队列是可以选出最小边权的一条边,并对它的两头进行扩展,符合Prim算法的思想,但是这样的算法会把所有的关联边压入队列,那怎么保证比较次数尽量小?即选到了某个点关联最小边权的边就把其他关联边全舍弃呢?因此要增加一个vis数组,来记录这个点是否被“松弛操作过”(有点迪杰斯特拉的意思)因此边进入这个队列不会多次,由于不像迪杰斯特拉那样可能多次地进行对边进行松弛操作,大多数情况下一次就够了,因此适合稠密图,而Kruskal适合稀疏图。
代码:
#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;typedef pair<int,int> pii;const int N=1010;struct info{int p;int to;int dx;info(int t,int d):to(t),dx(d){}bool operator<(const info &a)const {return dx>a.dx;}};vector<info>E[N];int vis[N];void init(){for (int i=0; i<N; i++)E[i].clear();MM(vis);}int main(void){int n,m,x,y,z,i,j,k;int tcase;scanf("%d",&tcase);while (tcase--){init();scanf("%d%d",&n,&m);for (i=0; i<m; i++){scanf("%d%d%d",&x,&y,&z);E[x].push_back(info(y,z));E[y].push_back(info(x,z));}priority_queue<info> Q;for (i=0; i<E[1].size(); i++)Q.push(E[1][i]);vis[1]=1;int ans=0;while (!Q.empty()){info temp=Q.top();Q.pop();if(!vis[temp.to]){vis[temp.to]=1;ans+=temp.dx;for (i=0; i<E[temp.to].size(); i++)Q.push(E[temp.to][i]);}}bool flag=1;for (i=1; i<=n; i++){if(vis[i]==0){flag=0;break;}}flag?printf("%d\n",ans):puts("-1");}return 0;}
0 0
- ACM程序设计选修课——Problem E:(ds:图)公路村村通(Prim)
- ACM程序设计选修课——Problem E:(ds:图)公路村村通(优先队列或sort+克鲁斯卡尔+并查集优化)
- ACM程序设计选修课——Problem F:(ds:图)旅游规划(优先队列+SPFA)
- ACM程序设计选修课——Problem D: (ds:树)合并果子(最优二叉树赫夫曼算法)
- 村村通公路(Prim)
- ACM程序设计选修课——1044: (ds:队列)打印队列(queue模拟)
- (最小生成树问题:Prim,Kruskal)村村通公路
- PTA 7-11(图) 公路村村通(30 分) 最小生成树prim
- PAT 数据结构 06-图6. 公路村村通(30)Prim最小生成树算法
- ACM程序设计选修课——1049: Efface Numbers(贪心)
- ACM程序设计选修课——1058: Lucky Sequence(思考)
- ACM程序设计选修课——1081: 堆(BFS)
- ACM程序设计选修课——1041: XX's easy problem(神烦的多次字符串重定向处理)
- 数据结构课设 公路村村通 (最小生成树prim算法)
- 5-10 公路村村通 (30分) prim Kruskal 算法
- 数据结构实验之图论六:村村通公路 prim算法
- ACM程序设计选修课——1018: Common Subsequence
- 06-图6. 公路村村通(30) java
- MySQL_REPEATABLE-READ事务隔离级别 && 幻读
- ScrollView中EditText的滚动监听
- 上传图片(jpeg, png各种类型), 及视频
- 批处理定时备份
- hdfs块丢失导致的异常问题排查解决
- ACM程序设计选修课——Problem E:(ds:图)公路村村通(Prim)
- JAVA学习(10) 继承(5) 接口
- Java学习笔记之接口
- spring quarz定时器
- JAVA_面向对象1
- mysql float精度与范围总结
- RTSP协议-中文定义
- Servlet 单例多线程
- 购物车全屏移动