POJ 2485(最小生成树)
2016-01-24 10:14
246 查看
题目链接:http://poj.org/problem?id=2485
题意:求最小生成树的最大边,继续Kruskal水过。
题意:求最小生成树的最大边,继续Kruskal水过。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int maxn=505; int T,n,m; int map[maxn][maxn]; int f[maxn],r[maxn]; struct Kruskal{ int u; int v; int w; }q[2005000]; bool cmp(Kruskal a,Kruskal b){ return a.w<b.w; } void Make_Set(){ for(int i=0;i<n;i++){ f[i]=i; r[i]=1; } } int Find(int x){ return x==f[x]?x:Find(f[x]); } bool Union(int a,int b){ int ra=Find(a); int rb=Find(b); if(ra==rb) return false; else{ if(r[ra]<r[rb]){ f[ra]=rb; } else{ f[rb]=ra; if(r[ra]==r[rb]) r[ra]++; } } return true; } int main(){ #ifndef ONLINE_JUDGE freopen("test.in","r",stdin); freopen("test.out","w",stdout); #endif scanf("%d",&T); while(T--){ scanf("%d",&n); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ scanf("%d",&map[i][j]); } } int num=0; for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ q[num].u=i; q[num].v=j; q[num].w=map[i][j]; num++; } } int ans=-0x3f,cnt=0; Make_Set(); sort(q,q+num,cmp); for(int i=0;i<num;i++){ if(cnt==n) break; if(Union(q[i].u,q[i].v)){ if(q[i].w>ans) ans=q[i].w; cnt++; } } printf("%d\n",ans); } return 0; }
相关文章推荐
- python ftplib模块编写简单的ftp服务
- 无偏估计与自由度
- java基础学习笔记
- Springmvc(5)之多部件表单、json交互和拦截器
- 分享js document.all的用法
- Java SimpleDateFormat parse 遭遇unparsable date异常
- 求方差时为什么要除以N—1,而不是除以N!【通俗理解-非数学专业】
- APUE_内存管理
- rspec 单元测试问题
- spark 命令行环境 python
- 企业项目化管理【一】:项目管理软件选型指南
- 详解PHP对象的串行化与反串行化
- 数组
- Eclipse快捷键大全
- Flex xml编辑器(老外写的)
- 正则表达式基础整理
- [转]Linux下卸载Source Insight 和wine的方法
- HDU 1035 Robot Motion
- DPF的前途
- Qt on Android:QTableView不显示选中虚框