HDU 5253 连接的管道
来源:互联网 发布:js如何封装 编辑:程序博客网 时间:2024/06/05 10:10
分析:题意就不说了,因为这题的高度差比较小,所以可以用并查集暴力求解,做的时候发现带参数的宏定义的效率很低,比如我用# define abs(x) (x>0?x:-(x)) 这样就超时了,写个函数就不会超时,用暴力的话,一不小心就超时了。这题还可以用Kruskal的最小生成树来做,但速度居然没有暴力的快,也许是我写的姿势不对。
并查集暴力:
# include <stdio.h># include <string.h> int n,m,map[1005][1005],root[1000005]; void Init() { int i; for(i=0;i<n*m;i++) root[i]=i; } int Find(int x) { if(root[x]!=x) root[x]=Find(root[x]); return root[x]; } int main() { int i,j,k,sum,T,t=1,fa,fb; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); Init(); for(i=0;i<n;i++) for(j=0;j<m;j++) scanf("%d",&map[i][j]); for(i=0;i<n;i++) map[i][m]=1000; for(j=0;j<m;j++) map[n][j]=1000; for(k=0,sum=0;k<=100;k++)//从高度差为0到100找一遍 for(i=0;i<n;i++) for(j=0;j<m;j++) { if(map[i][j]-map[i][j+1]==k||map[i][j+1]-map[i][j]==k) { fa=Find(i*m+j); fb=Find(i*m+j+1); if(fa!=fb) root[fa]=fb,sum+=k; } if(map[i][j]-map[i+1][j]==k||map[i+1][j]-map[i][j]==k) { fa=Find(i*m+j); fb=Find(i*m+j+m); if(fa!=fb) root[fa]=fb,sum+=k; } } printf("Case #%d:\n%d\n",t++,sum); } return 0; }
Kruskal最小生成树:
# include <stdio.h># include <algorithm> using namespace std; struct edge { int u,v,w; }e[2000005]; int n,m,k,t=1,map[1005][1005],root[1000005]; int Find(int x) { if(root[x]!=x) root[x]=Find(root[x]); return root[x]; } int abs(int x) { return x>0?x:-x; } int cmp(edge a,edge b) { return a.w<b.w; } void Kruskal() { int i,fa,fb,sum=0; for(i=0;i<n*m;i++) root[i]=i; sort(e,e+k,cmp); for(i=0;i<k;i++) { fa=Find(e[i].u); fb=Find(e[i].v); if(fa!=fb) root[fa]=fb,sum+=e[i].w; } printf("Case #%d:\n%d\n",t++,sum); } int main() { int i,j,T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(i=0;i<n;i++) for(j=0;j<m;j++) scanf("%d",&map[i][j]); for(i=0,k=0;i<n;i++) for(j=0;j<m-1;j++) { e[k].u=i*m+j; e[k].v=i*m+j+1; e[k++].w=abs(map[i][j]-map[i][j+1]); } for(i=0;i<n-1;i++) for(j=0;j<m;j++) { e[k].u=i*m+j; e[k].v=i*m+j+m; e[k++].w=abs(map[i][j]-map[i+1][j]); } Kruskal(); } return 0; }
0 0
- HDU 5253 连接的管道
- HDU 5253 连接的管道
- hdu 5253 连接的管道
- HDU 5253 连接的管道
- HDU 5253 连接的管道
- 【HDU 5253 连接的管道】
- HDU 5253:连接的管道
- HDU 5253 连接的管道
- HDU 5253-连接的管道
- 连接的管道-HDU
- hdu 5253 连接的管道(kruskal)
- hdu 5253连接的管道(kruskal)
- hdu 5253 连接的管道 简单MST
- HDU-5253 连接的管道 (Kruskal)
- HDU 5253 连接的管道 —— 并查集
- 【HDU】5253-连接的管道(并查集)
- 连接的管道 HDU 杭电5253 【最小生成树】
- HDU 5253 连接的管道 (bfs + 优先队列)
- 理解快速排序法。
- ActivityManager: Warning: Activity not started, its current task has been brought to the front问题
- android学习----overridePendingTransition
- Mix and Build(简单DP)
- Gitlab常用操作
- HDU 5253 连接的管道
- 大型网站动态应用系统架构
- yii2.0发送邮件发不出去问题记录
- 详细学习之java中的日期转换
- WaitForSingleObject函数用法及互斥对象的理解 .
- Spring inner bean examples
- forward与include转发问题(RequestDispatcher.include()(乱码问题分析及解决)
- ubuntu14.04 安装nginx和php5.6.12
- ABBYY PDF Transformer+到底有哪些专业术语(一)