开始了最小生成树,以简单应用为例hoj1323,1232(求连通分支数,直接并查集即可)

prim(n*n) 一般用于稠密图,而Kruskal(m*log(m))用于系稀疏图

#include<iostream>              //prim  n^2
#include<cstdio>
#include<cstring>
using namespace std;
const int inf=0x3f3f3f3f;
int a[102][102];int dis[102];int mark[102];
int main()
{
int n;
while(cin>>n&&n)
{
int m=n*(n-1)/2;
int x,y;
memset(a,0x3f,sizeof(a));
memset(dis,0x3f,sizeof(dis));
memset(mark,0,sizeof(mark));
while(m--)
{
scanf("%d%d",&x,&y);
int temp;
scanf("%d",&temp);
if(a[x][y]>temp)
a[x][y]=temp;
a[y][x]=a[x][y];
}
int ans=0;
int cur=1;
mark[cur]=1;
for(int i=1;i<n;i++) //加入n-1条边
{
int minedge=inf; int vertex; //每次找最小的边和新加入的点
for(int j=1;j<=n;j++)
if(mark[j]==0)
{
if(dis[j]>a[cur][j]) //更新
{
dis[j]=a[cur][j];
}
if(minedge>dis[j]) //得最小边
{
minedge=dis[j];
vertex=j;
}
}
ans+=minedge;
cur=vertex; //新加入的点cur
mark[cur]=1; //已经加入
}
printf("%d\n",ans);
}
return 0;
}
#include<iostream>        //kruskal ,+并查集维护,m*logm
#include<vector>
#include<algorithm>
#include<cstdio>
using namespace std;
const int inf=0x3f3f3f3f;
int fa[102];
int father(int x){return (x==fa[x]?x:father(fa[x]));}
struct edge
{
int x,y,w;
};
bool my(const edge &a,const edge &b) //先按权重排序
{
return a.w<b.w;
}
int main()
{
int n;
while(cin>>n&&n)
{
int m=n*(n-1)/2;
vector<edge>v(m);
for(int i=1;i<=n;i++) //初始化并查集
fa[i]=i;
for(int i=0;i<m;i++)
{
scanf("%d%d",&v[i].x,&v[i].y);
int temp;
scanf("%d",&temp);
v[i].w=temp;
}
int ans=0;
sort(v.begin(),v.end(),my); //排序
for(int i=0,num=0;num<n-1;i++) //取
{
int xx=father(v[i].x);int yy=father(v[i].y);
if(xx!=yy) //不是同一个连通分量,合并之
{
ans+=v[i].w;
fa[xx]=yy;
num++; //发现一个有效边,共n-1条。
}
}
printf("%d\n",ans);
}
return 0;
}
#include<iostream>                 //求无向图连通分支数,直接并查集。
#include<vector>
#include<algorithm>
#include<cstdio>
#include<set>
using namespace std;
int fa[1002];
int father(int x){return (x==fa[x]?x:father(fa[x]));}
struct edge
{
int x,y;
};
int main()
{
int n,m;
while(~scanf("%d",&n)&&n)
{
scanf("%d",&m);
vector<edge>v(m);
for(int i=1;i<=n;i++)
{
fa[i]=i; //初始化
}
for(int i=0;i<m;i++)
{
scanf("%d%d",&v[i].x,&v[i].y);
} for(int i=0;i<m;i++)
{
int xx=father(v[i].x); //x--y有边。
int yy=father(v[i].y);
fa[xx]=yy;
}
int count=0;
set<int>se;
for(int i=1;i<=n;i++) //只需看有几个father(i)(等价类),一个连通分量只对应一个。
{
se.insert(father(i));
}
count=se.size()-1;
printf("%d\n",count);
}
return 0;
}

Minimum Spanning Tree.prim/kruskal(并查集)的更多相关文章

  1. 最小生成树(Minimum Spanning Tree)——Prim算法与Kruskal算法+并查集

    最小生成树——Minimum Spanning Tree,是图论中比较重要的模型,通常用于解决实际生活中的路径代价最小一类的问题.我们首先用通俗的语言解释它的定义: 对于有n个节点的有权无向连通图,寻 ...

  2. Connect the Campus (Uva 10397 Prim || Kruskal + 并查集)

    题意:给出n个点的坐标,要把n个点连通,使得总距离最小,可是有m对点已经连接,输入m,和m组a和b,表示a和b两点已经连接. 思路:两种做法.(1)用prim算法时,输入a,b.令mp[a][b]=0 ...

  3. 最小生成树 (Minimum Spanning Tree,MST) --- Kruskal算法

    本文链接:http://www.cnblogs.com/Ash-ly/p/5409265.html 引导问题: 假设要在N个城市之间建立通信联络网,则连通N个城市只需要N - 1条线路.这时,自然会考 ...

  4. MST(Kruskal’s Minimum Spanning Tree Algorithm)

    You may refer to the main idea of MST in graph theory. http://en.wikipedia.org/wiki/Minimum_spanning ...

  5. 【HDU 4408】Minimum Spanning Tree(最小生成树计数)

    Problem Description XXX is very interested in algorithm. After learning the Prim algorithm and Krusk ...

  6. 数据结构与算法分析–Minimum Spanning Tree(最小生成树)

    给定一个无向图,如果他的某个子图中,任意两个顶点都能互相连通并且是一棵树,那么这棵树就叫做生成树(spanning tree). 如果边上有权值,那么使得边权和最小的生成树叫做最小生成树(MST,Mi ...

  7. HDU 4408 Minimum Spanning Tree 最小生成树计数

    Minimum Spanning Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  8. 说说最小生成树(Minimum Spanning Tree)

    minimum spanning tree(MST) 最小生成树是连通无向带权图的一个子图,要求 能够连接图中的所有顶点.无环.路径的权重和为所有路径中最小的. graph-cut 对图的一个切割或者 ...

  9. hdu 4408 Minimum Spanning Tree

    Problem Description XXX is very interested in algorithm. After learning the Prim algorithm and Krusk ...

随机推荐

  1. Bloom Filter概念和原理【转】

    Bloom Filter概念和原理 Bloom Filter是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合.Bloom Filter的这种高效是有 ...

  2. Halcon学习笔记1

    转:https://www.cnblogs.com/hanzhaoxin/archive/2013/02/15/2912879.html 机器视觉工程应用主要可划分为硬件和软件两大部分. 硬件:工程应 ...

  3. 下拉列表事件 Dropdown iview

    <Dropdown @on-click="export"> <Button icon='md-log-out'> 000l <Icon type=&q ...

  4. es 集群部署

    下载 [root@localhost ~]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.5.1 ...

  5. C++派生类继承父类修饰符

    公式: 继承成员对外的访问属性 = Max{继承方式,父类成员访问级别}: 1.如果子类从父类继承时使用的继承限定符是public,那么(1)父类的public成员成为子类的public成员,允许类以 ...

  6. MySQL-07 日志管理

    学习目标 MySQL日志 二进制日志 错误日志 查询通用日志 慢查询日志 MySQL日志 MySQL日志分为四类,说明如下: 错误日志:记录MySQL服务的启动.运行或者停止时出现的问题. 查询日志: ...

  7. 【php】查看扩展的版本

    php --ri [扩展名称] 例如: php --ri mongodb mongodb MongoDB support => enabled MongoDB extension version ...

  8. IDEA无法编译源码,IDEA查看源码出现/* compiled code */

    打开Settings -> Plugins    搜索dec,选中,确定,重启,解决

  9. 洛谷P1421 小玉买文具

    这道题其实就是编程最基础的逻辑,没什么好讲的输入,输出就完了,非常简单! code: #include<cstdio> #include<iostream> using nam ...

  10. tornado框架基础06-SQLAlchemy连接数据库

    01 ORM 在服务器后台,数据是要存储在数据库的,但是如果项目在开发和部署的时候,是使用的不同的数据库,该怎么办呢?是不是需要把所有的 SQL 语句都再重新写一遍呢? 和数据库相关,不同的数据库需要 ...