题意:求最小生成树中最大的一条边。

分析:求最小生成树,可用Prim和Kruskal算法。一般稀疏图用Kruskal比较适合,稠密图用Prim。由于Kruskal的思想是把非连通的N个顶点用最小的代价构成一个连通分量,这与并查集的思想类似,所以可以用并查集来实现Kruskal。

import java.util.Scanner;

/**
* 稀疏图用Prim,21316K,3047MS 不划算、
*/
public class Poj_2395_Prim { static int n,m;
static int[][] map=new int[2010][2010];
static boolean vis[]=new boolean[2010]; public static int prime() {
int i,j,min,flag = 0,max=-1; vis[1]=true;
for(i=2;i<=n;i++){
min=Integer.MAX_VALUE;
flag=0;
for(j=1;j<=n;j++){
if(!vis[j] && map[1][j] < min){
min=map[1][j];
flag=j;
}
}
vis[flag]=true;
max = max < min ? min : max;
for(j=1;j<=n;j++){
if(!vis[j] && map[flag][j] <map[1][j]){
map[1][j]=map[flag][j];
}
}
}
return max;
} public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt(); for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
map[i][j]=Integer.MAX_VALUE;
}
map[i][i]=0;
} for (int i = 1; i <= m; i++) {
int s=sc.nextInt();
int e=sc.nextInt();
int val=sc.nextInt();
if(map[s][e] > val){
map[s][e] = val;
map[e][s]=val;
}
} System.out.println(prime());
}
}
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Scanner; class Edge{
int s;
int e;
int val;
public Edge(int s,int e,int val){
this.s=s;
this.e=e;
this.val=val;
}
} class Com implements Comparator<Edge>{
@Override
public int compare(Edge o1, Edge o2) {
// TODO Auto-generated method stub
return o1.val - o2.val;
}
} /**
*Kruskal
*/
public class Poj_2395_kruskal { static int n,m;
static int MAX = 4000000;
static ArrayList<Edge> list = new ArrayList<Edge>();
static int set[] = new int[MAX]; static void init_set(){
for(int i=1;i<=n;i++){
set[i]=i;
}
} static int find(int a){
if(set[a] == a){
return a;
}else{
return set[a]=find(set[a]);
}
} static void unite(int x,int y){ x = find(x);
y = find(y);
if (x == y)
return;
if (y < x)
set[x] = y;
else if (y > x)
set[y] = x;
} static boolean same(int x, int y){
return find(x) == find(y);
} static int kruskal(){
int ans=-1;
init_set();
for(int i=0;i < list.size();i++){
Edge e =list.get(i);
if (!same(e.s, e.e)){
unite(e.s, e.e);
if (ans < e.val)
ans = e.val;
}
}
return ans;
} public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt(); for (int i = 1; i <= m; i++) {
int s=sc.nextInt();
int e=sc.nextInt();
int val=sc.nextInt();
list.add(new Edge(s,e,val));
}
Collections.sort(list,new Com());
System.out.println(kruskal());
}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

最新文章

  1. DDD领域驱动设计 - 设计文档模板
  2. 关于ListView中notifyDataSetChanged()刷新数据不更新原因
  3. 在Salesforce中添加Workflow Rule
  4. Task&lt;TResult&gt; 类
  5. Charles抓取https请求详解
  6. 数据库——MySQL——&gt;Java篇
  7. Java反射---对象池
  8. jQuery mouse and lunbo
  9. oracle数据库驱动(ojdbc)
  10. python读取数据库出txt报表
  11. Ubuntu 16.04.2 配置VNC
  12. MYSQL: 1292 - Truncated incorrect DOUBLE value: &#39;184B3C0A-C411-47F7-BE45-CE7C0818F420&#39;
  13. 用Python删除本地目录下某一时间点之前创建的文件
  14. pyg 图片服务器中使用的nginx 编译位置
  15. ntpdate[31915]: the NTP socket is in use, exiting
  16. Android异步处理系列文章四篇之四 AsyncTask的实现原理
  17. ubuntu安装mongo数据库
  18. R语言学习笔记—K近邻算法
  19. 2018年美国大学生数学建模竞赛(MCM/ICM) A题解题思路
  20. JSON 接口如何实现 RSA 非对称加密与签名

热门文章

  1. jQuery可放大预览的图片滑块
  2. 20145230《java程序设计》 第四次实验报告
  3. Helm - Kubernetes包管理专家
  4. 关于v4l2的一点变更
  5. 我到 vim 配置文件---------修改从---http://www.cnblogs.com/ma6174/archive/2011/12/10/2283393.html
  6. springcloud-声明式调用服务Feign
  7. hdoj1004--Let the Balloon Rise
  8. java对象流(二)
  9. C语言基础一
  10. 简单的说一下:tarits技法就是一种模板元编程,起可以将本来处于运行期的事拉到编译期来做,增加了运行效率。 看以非模板元编程的例子,就是前面的那个例子: