//    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. TDD的iOS开发初步以及Kiwi使用入门

    测试驱动开发(Test Driven Development,以下简称TDD)是保证代码质量的不二法则,也是先进程序开发的共识.Apple一直致力于在iOS开发中集成更加方便和可用的测试,在Xcode ...

  2. selenium控制浏览器为手机模式

    # -*- coding: utf-8 -*- from selenium import webdriver from time import sleep mobileEmulation = {'de ...

  3. applicationContext.xml文件如何调用外部properties等配置文件

    只需要在applicationContext.xml文件中添加一行: <!-- 导入外部的properties文件 --> <context:property-placeholder ...

  4. python pep8编码风格学习记录(转)

    简要归纳 每个缩进层级使用4个空格. 每行最多79个字符. 顶层的函数或类的定义之间空两行. 采用ASCII或UTF-8编码文件 在文件顶端,注释和文档说明之下,每行每条import语句只导入一个模块 ...

  5. 简谈WP,IOS,Android智能手机OS

    什么是智能手机? 相信到现在这个已经是傻瓜到不能再傻瓜的问题了 智能手机都不懂? 那你活着还有什么意思= = 但是为了谈论今天的三大主角:wp,ios,android 不得不回答一下这个笨笨的问题 如 ...

  6. JavaScript Best Practices

    原文: https://www.w3schools.com/js/js_best_practices.asp --------------------------------------------- ...

  7. ubuntu apt-get install xxx时一直报错E: Unable to locate package xxxxxxx

    $ sudo add-apt-repository main $ sudo add-apt-repository universe $ sudo add-apt-repository restrict ...

  8. react-native 项目实战 -- 新闻客户端(1) -- 初始化项目结构

    1.在项目根目录新建Componet文件夹(专门用来放我们的自定义组件),里面新建Main.js.Home.js.Message.js.Mine.js.Find.js 2.修改 index.andro ...

  9. 键盘上所有键位的ascii值

    上次用的时候一直找,这次找到了,收藏起来. 0x1 鼠标左键 0x2 鼠标右键 0x3 CANCEL 键 0x4 鼠标中键 0x8 BACKSPACE 键 0x9 TAB 键 0xC CLEAR 键 ...

  10. Jenkins安装火线fireline插件

    原文请访问:http://magic.360.cn/zh/user.html 提示:如果您是第一次使用Jenkins,请先前往文章[Jenkins下载安装配置教程] 1. 点击左上角的`Jenkins ...