//    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. 响应头里的"Last-Modified"值是怎么来的?

    1.如图所示,app.js文件得到的响应头的"Last-Modified"数值是:Mon, 09 Sep 2013 09:18:22 GMT 我们查看服务器上的app.js文件的修 ...

  2. Delphi之过程与函数

    过程以保留字procedure开始,没有返回值:函数以保留字function开始,有返回值. 参数位于括号里面,多个参数之间以分号分隔,例如: procedure SetDate(Year: Inte ...

  3. elasticsearch升级步骤

    ES从1.2.1升级到1.4.0 升级步骤,基本上是按照官网的叙述来完成的,链接是:http://www.elasticsearch.org/guide/en/elasticsearch/refere ...

  4. How to dynamically load directive into page

    https://stackoverflow.com/questions/23556398/how-to-dynamically-load-directive-into-page I have an h ...

  5. 2017.7.12 IDEA热部署(更新jsp或java代码不用重启tomcat即可即时生效)

    选择war explored. 主要在于 On frame deactivation选项配置选择为 Update classes and resourses(当且仅当在Deployment配置页,对应 ...

  6. 2017.3.31 spring mvc教程(三)拦截器

    学习的博客:http://elf8848.iteye.com/blog/875830/ 我项目中所用的版本:4.2.0.博客的时间比较早,11年的,学习的是Spring3 MVC.不知道版本上有没有变 ...

  7. sql 查询重复的数据

    select * from yryz_role_partner where user_id in (select user_id from yryz_role_partner group by use ...

  8. IDEA搭建maven项目

    新建 新建maven项目.create from archetype.选择maven-archetype-webapp Next.填写GroupId,ArtifactId和Version attnam ...

  9. Linux非阻塞IO(八)使用epoll重新实现非阻塞的回射服务器

    本文无太多内容,主要是几个前面提到过的注意点: 一是epoll的fd需要重新装填.我们将tcp_connection_t的指针保存在数组中,所以我们以这个数组为依据,重新装填fd的监听事件. //重新 ...

  10. 微信小程序 之 请求函数封装

    封装的request的代码 /** * @desc API请求接口类封装 */ /** * POST请求API * @param {String} url 接口地址 * @param {Object} ...