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个定点的连通网可以建立许多不同的生成树,每一棵生成树都可 ...
随机推荐
- mysql memcache
http://blog.csdn.net/newjueqi/article/details/8350643
- 图片和提交servlet的相对和绝对路径
xx.jsp在根目录下,图片的路径为:<img height="33" src="images/enter.gif" width="148&qu ...
- jdk1.6,jdk1.7共存
当然可以,安装的时候记得选择不同的安装目录,安装好以后,可以在开发工具(如eclipse)中切换不同的编译环境和运行环境.其实只要安装eclipse就自带了jdk1.3-1.6的编译环境了. Mac下 ...
- Android UI ActionBar功能-ActionBarSherlock 的使用
ActionBarSherlock实现了在ActionBar上添加一个下拉菜单的功能,也是App常用的功能之一: ActionBarSherlock是第三方提供的一个开源类库,下载地址:http:// ...
- UC浏览器开发者版调试手机页面
1 关于RI 目前,在手机上使用浏览器访问网页,无法便捷地进行网页语言调试.手机屏幕相对较小且操作不便,直接在手机上进行网页数据调试不太现实. 因此,我们使用技术将手机网页调试信息分离,实现一种能在大 ...
- Moss 几个编程技巧
1.提升权限执行的代码 SPSecurity.RunWithElevatedPrivileges(delegate() { // 需要提升权限执行的代码 }); 应用场景:当前用户可能没有权限执行的操 ...
- 做ie8css样式时浏览器默认杂项模式遇到的一个小坑
1 进行ie浏览器的样式兼容的时候,首先要确保打开浏览器浏览网页的时候的文本模式要为当前浏览器的"标准模式",注意<!DOCTYPE html>不缺失不错误,以免浏览器 ...
- SQL Server 触发器2
触发器可以做很多事情,但也会带来很多问题.使用它的技巧在于在适当的时候使用,而不要在不适当的时候使用它们. 触发器的一些常见用途如下: 弹性参照完整性:实现很多DRI不能实现的操作(例如,跨数据库或服 ...
- hdu3516
题目大意:这个....翻译起来还真是不好说,各位四六没过的ACMer正好去原网页看看题意,过了的好孩子还是去看看原网页看看锻炼一下吧.(当然我做这道题目的时候,教练已经摆明说要用四边形不等式,所以还是 ...
- Linux学习之停止进程
首先,用ps查看进程,方法如下: ps -ef ……smx 1822 1 0 11:38 ? 00:00:49 gnome-terminalsmx 18 ...