//    poj1861 最小生成树 prim & kruskal
//
// 一个水题,为的仅仅是回味一下模板。日后好有个照顾不是 #include <cstdio>
#include <algorithm>
#include <cstring>
#include <vector>
#include <iostream> using namespace std; const int MAX_N = 1008;
const int INF = 0x3f3f3f3f;
int g[MAX_N][MAX_N];
int n,m;
int cnt;
int mx;
int d[MAX_N];
bool vis[MAX_N];
int pre[MAX_N];
struct edge{
int from;
int to;
int w; edge(){ } edge(int from,int to,int w): from(from),to(to),w(w){ } };
edge edges[MAX_N * 15]; bool cmp(edge a,edge b){
return a.w < b.w;
} void print1(){
for (int i=1;i<=n;i++){
for (int j=1;j<=n;j++)
printf("%d ",g[i][j]);
puts("");
} } void input1(){
int u,v,cost; for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++){
g[i][j] = INF;
if (i == j)
g[i][j] = 0;
} for (int i=0;i<m;i++){
scanf("%d%d%d",&u,&v,&cost);
g[u][v] = g[v][u] = cost; } // print1(); for (int i=1;i<=n;i++){
pre[i] = 1;
} cnt = 0; } int fa[MAX_N];
int height[MAX_N];
void input2(){
int u,v,cost;
for (int i=1;i<=m;i++){
scanf("%d%d%d",&u,&v,&cost);
edges[i] = edge(u,v,cost);
}
for (int i=1;i<=n;i++){
fa[i] = i;
height[i] = 0;
}
sort(edges+1,edges+m+1,cmp); } int getf(int x){
if (x==fa[x])
return x;
return fa[x] = getf(fa[x]);
} void kruskal(){
int cnt = 0;
int mx = 0;
for (int i=1;i<=m;i++){
int x = getf(edges[i].from);
int y = getf(edges[i].to);
if (x==y)
continue;
if (height[x] < height[y]){
fa[x] = y;
}else {
fa[y] = x;
if (height[x]==height[y])
height[x]++;
}
mx = max(mx,edges[i].w);
edges[cnt++] = edges[i];
}
printf("%d\n",mx);
printf("%d\n",cnt);
for (int i=0;i<cnt;i++){
printf("%d %d\n",edges[i].from,edges[i].to);
}
} void prim(){
for (int i=1;i<=n;i++)
d[i] = g[1][i];
d[1] = 0;
for (int i=1;i<=n;i++){
vis[i] = 0;
}
vis[1] = 1;
mx = 0;
for (int i=1;i<=n;i++){
int k = -1;
for (int j=1;j<=n;j++){
if (!vis[j] && (k == -1 || d[k] > d[j])){
k = j;
}
}
if (k==-1)
break;
vis[k]++;
mx = max(mx,d[k]);
edges[cnt++] = edge(k,pre[k],d[k]);
for (int j=1;j<=n;j++){
if (!vis[j] && g[k][j]!= INF &&d[j] > g[k][j]){
d[j] = g[k][j];
pre[j] = k;
}
} } } void print(){
printf("%d\n",mx);
printf("%d\n",cnt);
for (int i=0;i<cnt;i++){
printf("%d %d\n",edges[i].from,edges[i].to);
}
} void solve(){
//prim();
kruskal();
//print();
} int main(){ freopen("1.txt","r",stdin);
while(scanf("%d%d",&n,&m)!=EOF){ //input1();
input2();
solve();
}
}

poj1861 最小生成树 prim &amp; kruskal的更多相关文章

  1. 图的最小生成树(Prim、Kruskal)

    理论: Prim: 基本思想:假设G=(V,E)是连通的,TE是G上最小生成树中边的集合.算法从U={u0}(u0∈V).TE={}开始.重复执行下列操作: 在所有u∈U,v∈V-U的边(u,v)∈E ...

  2. 最小生成树 Prim算法 Kruskal算法实现

    最小生成树定义 最小生成树是一副连通加权无向图中一棵权值最小的生成树. 在一给定的无向图 G = (V, E) 中,(u, v) 代表连接顶点 u 与顶点 v 的边(即,而 w(u, v) 代表此边的 ...

  3. 最小生成树Prim算法 Kruskal算法

    Prim算法(贪心策略)N^2 选定图中任意定点v0,从v0开始生成最小生成树 树中节点Va,树外节点Vb 最开始选一个点为Va,其余Vb, 之后不断加Vb到Va最短距离的点 1.初始化d[v0]=0 ...

  4. 最小生成树--Prim及Kruskal

    //prim算法#include<cstdio> #include<cmath> #include<cstring> #include<iostream> ...

  5. 最小生成树prim和kruskal模板

    prim: int cost[MAX_V][MAX_V]; //cost[u][v]表示边e=(u,v)的权值(不存在的情况下设为INF) int mincost[MAX_V]; //从集合X出发的每 ...

  6. 最小生成树Prim算法Kruskal算法

    Prim算法采用与Dijkstra.Bellamn-Ford算法一样的“蓝白点”思想:白点代表已经进入最小生成树的点,蓝点代表未进入最小生成树的点. 算法分析 & 思想讲解: Prim算法每次 ...

  7. 最小生成树 Prim和Kruskal

    感觉挺简单的,Prim和Dijkstra差不多,Kruskal搞个并查集就行了,直接上代码吧,核心思路都是找最小的边. Prim int n,m; int g[N][N]; int u,v; int ...

  8. 邻接矩阵c源码(构造邻接矩阵,深度优先遍历,广度优先遍历,最小生成树prim,kruskal算法)

    matrix.c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include < ...

  9. 转载:最小生成树-Prim算法和Kruskal算法

    本文摘自:http://www.cnblogs.com/biyeymyhjob/archive/2012/07/30/2615542.html 最小生成树-Prim算法和Kruskal算法 Prim算 ...

随机推荐

  1. android下socket编程问题:服务器关闭时,客户端发送请求的异常处理

    我用socket分别创建了一个服务器和一个客户端. 当服务器程序运行时,客户端和服务器发送接收数据是OK的. 但是,如果服务器程序关闭以后,客户端仍然发送请求的话,会抛出一个IOException.但 ...

  2. python常见的编程错误

    常见的编程错误 2.1 试图访问一个未赋值的变量,会产生运行时错误. 2.2 ==,!=, >=和<=这几个运算符的两个符号之间出现空格,会造成语法错误. 2.3 !=,<>, ...

  3. java的Commons包简介

    http://mxdxm.iteye.com/blog/758453 Jakarta Commons是Jakarta的一个子项目,目的是创建和维护独立于其他框架和产品的程序包(packages).Ja ...

  4. POJ 2983-Is the Information Reliable?(差分约束系统)

    题目地址:POJ 2983 题意:有N个车站.给出一些点的精确信息和模糊信息.精确信息给出两点的位置和距离.模糊信息给出两点的位置.但距离大于等于一.试确定是否全部的信息满足条件. 思路:事实上就是让 ...

  5. JavaWeb教程路线

    主要内容大概例如以下: 1.开发环境搭建 2.servlet/jsp解说 3.mysql解说 4.JDBC解说 5.ssh解说 6.整合开发 7.样例具体解释

  6. 【机器学习】Mahout算法集

    在Mahout实现的机器学习算法见下表 算法类 算法名 中文名 分类算法 Logistic Regression 逻辑回归 Bayesian 贝叶斯 SVM 支持向量机 Perceptron 感知器算 ...

  7. Restful风格的前后端分离

    1.概述 ResultFul推荐每个URL能操作具体的资源,而且能准确描述服务器对资源的处理动作,通常服务器对资源支持get/post/put/delete/等,用来实现资源的增删改查.前后端分离的话 ...

  8. selenium从入门到应用 - 2,简单线性脚本的编写

    本系列所有代码 https://github.com/zhangting85/simpleWebtest 本文将介绍一个Java+TestNG+Maven+Selenium的web自动化测试脚本环境下 ...

  9. STL学习笔记(排序算法)

    STL提供了好几种算法对区间内的元素排序.出来完全排序外,还支持局部排序. 对所有元素排序 void sort(RandomAccessIterator beg,RandomAccessIterato ...

  10. ubuntu下USB连接Android手机

    初始工作:将Android手机通过usb连接到电脑,之后点击VM-Removable Devices-google Android - Connect,即可. 若通过usb连接到电脑,Removabl ...