HDU5253(最小生成树)
2015-11-10 13:12
183 查看
// //最小生成树有很多种算法 习惯用并查集+克鲁斯卡尔 // main.c // example // // Created by Adam on 15/2/2. // Copyright (c) 2015年 Adam. All rights reserved. // #include <iostream> #include "stdio.h" #include "stdlib.h" #include "string.h" #include "algorithm" #include <queue> using namespace std; int ss[1005][1005]; int father[800000]; int n,m; struct node { int op,ed; int ans; }edge[2000005]; int find(int x) { if(x==father[x]) return x; else return father[x]=find(father[x]); } int cmp(node x,node y) { return x.ans<y.ans; } int main() { int t,pos,len,ans,cnt=0; scanf("%d",&t); while(t--) { pos=0; scanf("%d%d",&n,&m); for(int i=0;i<n;i++) for(int j=0;j<m;j++) scanf("%d",&ss[i][j]); for(int i=0;i<n;i++) for(int j=0;j<m;j++) { if(j!=m-1){ edge[pos].op=i*m+j; edge[pos].ed=i*m+j+1; edge[pos++].ans=abs(ss[i][j]-ss[i][j+1]); } if(i!=n-1){ edge[pos].op=i*m+j; edge[pos].ed=i*m+m+j; edge[pos++].ans=abs(ss[i][j]-ss[i+1][j]); } } for(int i=0;i<n*m;i++) { father[i]=i; } sort(edge,edge+pos,cmp); len=0;ans=0; for(int i=0;i<pos;i++) { int a=edge[i].op; int b=edge[i].ed; a=find(a); b=find(b); if(a==b) continue; father[a]=b; len++; ans+=edge[i].ans; if(len==(n*m-1)) break; } printf("Case #%d:\n%d\n",++cnt,ans); } return 0; }
相关文章推荐
- 一个好玩的计算题目(c++ 位运算)
- Ubuntu下配置samba服务器
- 为什么需要日志审计系统
- 中国安卓
- 关于js中单引号(')和双引号(")的使用以及转义的理解
- SAP FICO hande汉得培训资料---II 应收模块篇 PDF 电子版
- 用户故事
- post方式发送接收文件
- js在table指定tr行上或底下添加tr行
- CSRF 攻击的应对之道
- opencv学习笔记2
- LightOJ 1060 - nth Permutation(dp)
- 百度智能硬件质量白皮书
- Android之线程阻塞(一)
- fedora22配置双ip用于远程连接
- Apache TraceEnable关闭与测试方法
- LightOJ 1057 - Collecting Gold(dp)
- java-jstack
- 为什么需要日志审计系统
- SQL去空格