POJ - 1287超级模板题

大概意思就是点的编号从1到N,会给你m条边,可能两个点之间有多条边这种情况,求最小生成树总长度?

这题就不解释了,总结就算,prim是类似dijkstra,从第一个点出发,每次走这个点没走过的最小边权值,这样不断找下去就可以找出,本质就是贪心算法

而kruskal是利用并查集,先按照边权值大小排序,然后从小的边开始往里面添加边,利用并查集判断是否在一个联通分量里面(就是是否相连)如果不相

连就建立边,从而建图,注意,节点编号如果是从1->n,那么相应初始化就应该从1->N;

prim版本:

 #include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxx = 1e2+;
int cost[maxx][maxx];
int mincost[maxx];
bool used[maxx];
int v;
int m,n;
int prim(){
for (int i=;i<=n;i++){
mincost[i]=INF;
used[i]=false;
}
mincost[]=;//这里的数组的编号,代表我最开始建图的点
int res=;
while(true){
int v = -;
for (int u=;u<=n;u++){ //枚举边找到这个点的下一个边权值最小的点
if (!used[u] && (v==- || mincost[u] < mincost[v])) v=u;
}
if (v == -)break;//没有的话就返回,无法建图
used[v]=true;//顶点加入
res+=mincost[v];
for (int u=;u<=n;u++){
mincost[u] = min(mincost[u],cost[v][u]);//???
}
}
return res;
}
int main(){
int tmp1,tmp2,tmp3;
while(scanf("%d",&n) && n){
scanf("%d",&m);
if (m==){
cout<<""<<endl;
continue;
}
for (int i=;i<=n;i++){
for(int j=;j<=n;j++){
if (i==j)cost[i][j]=;
else cost[i][j]=INF;
}
}
for (int i=;i<=m;i++){
scanf("%d%d%d",&tmp1,&tmp2,&tmp3);
if (tmp3<cost[tmp1][tmp2])cost[tmp1][tmp2]=cost[tmp2][tmp1]=tmp3;//更新成最短边
}
cout<<prim()<<endl;
}
return ;
}

Kruskal

#include<iostream>
#include<string.h>
#include<stdio.h>
#include<algorithm>
using namespace std;
struct node{
int u,v,w;
}a[];
int p[];
int r[];
int n,m;
int find(int x){return p[x] == x ? x : p[x] = find(p[x]);}//找根节点
int cmp(node x,node y)
{
return x.w<y.w;//按照边权值排序
}
int Kruskal(){
int ans=;
int num=;
for (int i=; i<=n; i++)p[i]=i;
sort(a+,a++m,cmp);
for (int i=; i<=m; i++)
{
int x=find(a[i].u);//出发点的根节点
int y=find(a[i].v);//到达点的根节点
if (x!=y)//不是一个根节点
{
ans+=a[i].w;//连接
p[x]=y;//y是x的父亲节点
num++;//建立好了n-1条边
}
if (num==n-){
break;
}
}
return ans;
}
int main()
{
int tmp1,tmp2,tmp3;
while(~scanf("%d",&n))
{
if (n==)break;
scanf("%d",&m);
for (int i=; i<=m; i++)
{
scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);
}
printf("%d\n",Kruskal());
}
return ;
}

最小生成树模板题POJ - 1287-prim+kruskal的更多相关文章

  1. poj 1251 poj 1258 hdu 1863 poj 1287 poj 2421 hdu 1233 最小生成树模板题

    poj 1251  && hdu 1301 Sample Input 9 //n 结点数A 2 B 12 I 25B 3 C 10 H 40 I 8C 2 D 18 G 55D 1 E ...

  2. POJ 1258:Agri-Net Prim最小生成树模板题

    Agri-Net Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 45050   Accepted: 18479 Descri ...

  3. 最小生成树算法详解(prim+kruskal)

    最小生成树概念: 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边. 最小生成树可以用kruskal(克鲁斯卡尔)算法或prim(普里 ...

  4. O - 听说下面都是裸题 (最小生成树模板题)

    Economic times these days are tough, even in Byteland. To reduce the operating costs, the government ...

  5. RMQ 模板题 poj 3264

    题目:点这里 题意:给一个长度n的数列,然后又Q个询问,问L   到R   中最大值与最小值的差. 分析:RMQ 的模板题. 代码: #include<stdio.h> #include& ...

  6. POJ 1789 Truck History (Kruskal最小生成树) 模板题

    Description Advanced Cargo Movement, Ltd. uses trucks of different types. Some trucks are used for v ...

  7. POJ 1287 Networking (最小生成树模板题)

    Description You are assigned to design network connections between certain points in a wide area. Yo ...

  8. POJ 1789 Truck History【最小生成树模板题Kruscal】

    题目链接:http://poj.org/problem?id=1789 大意: 不同字符串相同位置上不同字符的数目和是它们之间的差距.求衍生出全部字符串的最小差距. #include<stdio ...

  9. POJ1258:Agri-Net(最小生成树模板题)

    http://poj.org/problem?id=1258 Description Farmer John has been elected mayor of his town! One of hi ...

随机推荐

  1. 使用Tampermonkey(油猴) 插件,重新实现了,百度搜索热点过滤功能

    昨天晚上,花了点时间学习了Chrome插件的制作方法,并书写了<Chrome 百度搜索热点过滤插件 - 开源软件>这一文章,简单地介绍自己实现的百度搜索热点过滤神器的原理和使用方式,并进行 ...

  2. 【PAT】B1033 旧键盘打字(20 分)

    #include<stdio.h> #include<algorithm> #include<ctype.h> using namespace std; bool ...

  3. C#异步编程の----Threadpool( 线程池)

    简介: 一个托管线程的创建需要数千个CPU周期,并且当发生线程切换时也会带来明显的开销.考虑线程的重用,避免不断重复创建新的线程是提高系统效率的一种方式. 线程池是一种提供效率的方式,它创建好一些线程 ...

  4. c++11の的左值、右值以及move,foward

    左值和右值的定义 在C++中,可以放到赋值操作符=左边的是左值,可以放到赋值操作符右边的是右值.有些变量既可以当左值又可以当右值.进一步来讲,左值为Lvalue,其实L代表Location,表示在内存 ...

  5. Android Activity学习笔记——Activity的启动和创建

    http://www.cnblogs.com/bastard/archive/2012/04/07/2436262.html 最近学习Android相关知识,感觉仅仅了解Activity几个生命周期函 ...

  6. ajax json 表格排序,分页,自己定义每页数量

    ajax json 表格排序.分页,自己定义每页数量  点击表头能够排序.依照升序或者降序,另外支持多列排序 设置每页数量 演示   XML/HTML Code <table id='examp ...

  7. [NOI2005]瑰丽华尔兹

    嘟嘟嘟 这题大家应该都做过,就是暴力dp+单调队列优化. dp方程其实很好想,最初是这样的:dp[t][i][j]表示时刻\(t\)后,走到\((i, j)\)格子的最远路程,于是就有: \[dp[t ...

  8. 深入springboot原理——一步步分析springboot启动机制(starter机制)

    前言 使用过springboot的同学应该已经知道,springboot通过默认配置了很多框架的使用方式帮我们大大简化了项目初始搭建以及开发过程.本文的目的就是一步步分析springboot的启动过程 ...

  9. vue分页全选和单选操作

    <!DOCTYPE html> <html> <head> <title>演示Vue</title> <style> ul,li ...

  10. java 面向对象内部类

    1.内部类概念:将一个类定义在另一个类的内部,该类就称为内部类 类中定义的内部类特点1) 内部类作为外部类的成员,可以直接访问外部类的成员(包括 private 成员),反之则不行.2) 内部类做为外 ...