HDU 1879 继续畅通工程 (Prim(普里姆算法)+Kruskal(克鲁斯卡尔))
继续畅通工程
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 10765 Accepted Submission(s): 4704
当N为0时输入结束。
1 2 1 0
1 3 2 0
2 3 4 0
3
1 2 1 0
1 3 2 0
2 3 4 1
3
1 2 1 0
1 3 2 1
2 3 4 1
0
1
0
这道题虽然是一道模板题,但是有一点要注意:
不能使用 Scanner sc = new Scanner(new BufferedInputStream(System.in)); 和
System.out.println();
否则会超时;
推荐使用: BufferedReader bu=new BufferedReader(new InputStreamReader(System.in)); 和
PrintWriter pw=new PrintWriter(new OutputStreamWriter(System.out),true);
克鲁斯卡尔
import java.io.*;
import java.util.*;
public class Main {
public int n,m,sum;
public ArrayList<kr> ay=new ArrayList<kr>();;
public int pattern[];
PrintWriter pw;
public static void main(String[] args) throws IOException{
new Main().work();
}
public void work() throws IOException{
BufferedReader bu=new BufferedReader(new InputStreamReader(System.in));
pw=new PrintWriter(new OutputStreamWriter(System.out),true);
n=Integer.parseInt(bu.readLine());
while(n!=0){
m=(n*(n-1))>>1;
ay.clear();
sum=0;
for(int i=0;i<m;i++){
String str[]=bu.readLine().split(" ");
int a=Integer.parseInt(str[0]);
int b=Integer.parseInt(str[1]);
int c=Integer.parseInt(str[2]);
int d=Integer.parseInt(str[3]);
if(d==1)
c=0;
kr k=new kr(a,b,c);
ay.add(k);
}
Collections.sort(ay);
Kruskral();
pw.println(sum);
n=Integer.parseInt(bu.readLine());
}
}
public void Kruskral(){
pattern=new int[n+1];
for(int i=1;i<=n;i++){
pattern[i]=i;
}
for(int i=0;i<ay.size();i++){
union(ay.get(i).a,ay.get(i).b,ay.get(i).c);
}
}
public void union(int a,int b,int c){
int aa=find(a);
int bb=find(b);
if(aa==bb)
return;
if(aa>bb){
pattern[bb]=aa;
sum+=c;
//pw.println(sum);
}
else{
pattern[aa]=bb;
sum+=c;
}
}
public int find(int x){
int k,r,s;
r=x;
while(r!=pattern[r]){
r=pattern[r];
}
k=x;
while(k!=r){
s=pattern[k];
pattern[k]=r;
k=s;
}
return r;
}
}
class kr implements Comparable<kr>{
int a;
int b;
int c;
kr(int a,int b,int c){
this.a=a;
this.b=b;
this.c=c;
}
public int compareTo(kr o) {
return this.c>o.c?1:-1;
}
}
普利姆算法
import java.io.*;
import java.util.*; public class Main {
public int MAX=2000000;
public int map[][];
public int n,m;
PrintWriter pw;
public static void main(String args[]) throws IOException{
new Main().work();
}
public void work() throws IOException{
//Scanner sc=new Scanner(new BufferedInputStream(System.in));
BufferedReader bu=new BufferedReader(new InputStreamReader(System.in));
pw=new PrintWriter(new OutputStreamWriter(System.out),true);
n=Integer.parseInt(bu.readLine());
while(n!=0){
m=(n*(n-1))>>1;
map=new int[n+1][n+1];
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
map[i][j]=MAX;
}
} for(int i=1;i<=m;i++){
String str[]=bu.readLine().split(" ");
int a=Integer.parseInt(str[0]);
int b=Integer.parseInt(str[1]);
int c=Integer.parseInt(str[2]);
int d=Integer.parseInt(str[3]);
if(d==1){
c=0;
}
if(map[a][b]>c)
map[a][b]=map[b][a]=c;
}
getDistance();
n=Integer.parseInt(bu.readLine());
}
}
////Prim(普里姆算法)
public void getDistance(){
int k=0,sum=0;
int dis[]=new int[n+1];
int mark[]=new int[n+1];
for(int i=2;i<=n;i++){
dis[i]=map[1][i];//初始化起点到其他点之间的距离
}
mark[1]=1;
for(int i=1;i<n;i++){
int min=MAX;
// 每次循环寻找的最短的边
for(int j=2;j<=n;j++){
if(mark[j]==0&&dis[j]<min){
min=dis[j];
k=j;
}
}
if(min==MAX) break;
mark[k]=1;
sum+=dis[k];
//到一个新的点,从新计算到其他点之间的距离
for(int j=2;j<=n;j++){
if(mark[j]==0&&dis[j]>map[k][j])
dis[j]=map[k][j];
}
}
pw.println(sum);
}
}
HDU 1879 继续畅通工程 (Prim(普里姆算法)+Kruskal(克鲁斯卡尔))的更多相关文章
- HDU 1879 继续畅通工程(Prim||Kruscal模板题)
原题链接 Prim(点归并) //异或运算:相同为假,不同为真 #include<cstdio> #include<algorithm> #define maxn 105 us ...
- hdu 1879 继续畅通工程
/************************************************************************/ /* hdu 1879 继续畅通工程 Time L ...
- 经典问题----最小生成树(prim普里姆贪心算法)
题目简述:假如有一个无向连通图,有n个顶点,有许多(带有权值即长度)边,让你用在其中选n-1条边把这n个顶点连起来,不漏掉任何一个点,然后这n-1条边的权值总和最小,就是最小生成树了,注意,不可绕成圈 ...
- 最小生成树---普里姆算法(Prim算法)和克鲁斯卡尔算法(Kruskal算法)
普里姆算法(Prim算法) #include<bits/stdc++.h> using namespace std; #define MAXVEX 100 #define INF 6553 ...
- 普里姆算法(Prim)
概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图(带权图)里搜索最小生成树.即此算法搜索到的边(Edge)子集所构成的树中,不但包括了连通图里的所有顶点(Vertex)且其所有边的权 ...
- 查找最小生成树:普里姆算法算法(Prim)算法
一.算法介绍 普里姆算法(Prim's algorithm),图论中的一种算法,可在加权连通图里搜索最小生成树.意即由此算法搜索到的边子集所构成的树中,不但包括了连通图里的所有顶点,且其所有边的权值之 ...
- ACM第四站————最小生成树(普里姆算法)
对于一个带权的无向连通图,其每个生成树所有边上的权值之和可能不同,我们把所有边上权值之和最小的生成树称为图的最小生成树. 普里姆算法是以其中某一顶点为起点,逐步寻找各个顶点上最小权值的边来构建最小生成 ...
- MST最小生成树及Prim普鲁姆算法
MST在前面学习了Kruskal算法,还有一种算法叫做Prim的.这两者的区别是Prim算法适合稠密图,比如说鸟巢这种几乎所有点都有相连的图.其时间复杂度为O(n^2),其时间复杂度与边的数目无关:而 ...
- 图->连通性->最小生成树(普里姆算法)
文字描述 用连通网来表示n个城市及n个城市间可能设置的通信线路,其中网的顶点表示城市,边表示两城市之间的线路,赋于边的权值表示相应的代价.对于n个定点的连通网可以建立许多不同的生成树,每一棵生成树都可 ...
随机推荐
- flex实现股票行情走势图
原文 http://blog.csdn.net/shenjiancomputer/article/details/8051873 第一步: jsp:1 <%@page import=" ...
- jquery validation plugin 使用
<!DOCTYPE html> <!-- To change this license header, choose License Headers in Project Prope ...
- 人生第一场组队赛---2014.8 zju monthly
暑期集训中段就组了队,不过一直没机会打比赛 昨天kitkat突然发现了zju要搞月赛,我想了一下题目对于我这种渣实在是有点难,于是想到干脆打一次组队赛吧,跟队友商量了一下也同意了 12点---17点 ...
- U-boot中实现Yaffs2+HwEcc
经过老手的指点,要实现Yaffs2+HwEcc,重点在于chip->ops.mode由MTD_OOB_RAW到MTD_OOB_AUTO.经过几天的筹备,今天要对其下手了.为了真实展现分析移植过程 ...
- 可用的CSS文字两端对齐
最近在工作项目中接触到Web界面设计的问题,要实现文字两端对齐的效果.在网上搜索了一下,用的都是类似的技巧: text-align:justify;text-justify:inter-ideogra ...
- ASP.Net连接SQLServer 连接字符串
引用命名空间 using System.Data; using System.Data.SqlClient; 连接字符串 // windows 验证方式数据库中存在单一实例 string connec ...
- c++中,size_typt, size_t, ptrdiff_t 简介
size_type 类型 从逻辑上来讲,size() 成员函数似乎应该返回整形数值,或如 2.2 节“建议”中所述的无符号整数.但事实上,size 操作返回的是 string::size_type 类 ...
- iOS状态栏字体设置为白色
info.plist 添加字段: view controller -base status bar appearence 设为NO [[UIApplication sharedApplication] ...
- 开源一个监控数据采集Agent:OpenFalcon-SuitAgent
OpenFalcon-SuitAgent 项目地址:github 版本说明 本系统版本划分如下 alpha:内部测试版(不建议使用于生产环境) beta:公开测试版(不建议使用于生产环境) final ...
- C++中联合体(union)的使用
typedef union para { ]; struct { double a; double b; double c; double d; }NP; }NPara; //或者如下所示 union ...