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个定点的连通网可以建立许多不同的生成树,每一棵生成树都可 ...
随机推荐
- python 学习day5(模块)
一.模块介绍 模块,用一砣代码实现了某个功能的代码集合. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合.而对于一个复杂的功能来,可能 ...
- DLL中传递STL参数,vector对象作为dll参数传递等问题(转)
STL跨平台调用会出现很多异常,你可以试试. STL使用模板生成,当我们使用模板的时候,每一个EXE,和DLL都在编译器产生了自己的代码,导致模板所使用的静态成员不同步,所以出现数据传递的各种问题,下 ...
- 成都UBER优步司机第六组奖励政策
保底时段详解 滴滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs. ...
- magento中取不同store中的产品数据
$products = Mage::getResourceModel('catalog/product_collection') ->setStoreId( ...
- 设计模式之二十四:訪问者模式(Visitor)
訪问者模式: 定义了一个作用于一个类的一些操作,訪问者模式同意在不改变类的前提下添加一些操作. Represent an operation to be performed on the elemen ...
- 设计模式六大原则——迪米特法则(LoD)
1.背景 在图书馆借书.刚開始的时候,直接跑到对应的楼层去,到里面去转,去找要借的书,在里面溜达半天才干找到:后来知道图书馆有一个电脑查询处.然后直接在电脑上输入想要借的书,电脑就会显示你想要借的书的 ...
- 不错的JS
http://www.17sucai.com/preview/47509/2013-10-18/Sequence-master/photo-stack/index.html
- HTML5实现坦克大战(一)
Tank 字段 x:坦克的中心点的横坐标 y:坦克的中心点的纵坐标 dir:坦克的前进的方向 spped:坦克的速度 color:坦克的颜色,用于区分种类不同的坦克 bullet:坦克的子弹 为a ...
- 第一章ASP.NET SignalR简介
第一章ASP.NET SignalR简介 1.1概述: ASP.NET SignalR是微软新开发的类库,为的是帮助ASP.NET开发人员很方便地开发实时网络功能. SignalR允许服务器端和客户端 ...
- Android 开源库
http://www.cnblogs.com/hawkon/p/3593709.html