开始了最小生成树,以简单应用为例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. webpack3整理(第三节/满三节)------(base.config文件解释)

    'use strict' const path = require('path') const utils = require('./utils') const config = require('. ...

  2. 求N个数的最大公约数

    使用 “辗转相除法” 计算2个数的最大公因数: int GCD_2(int nNum1, int nNum2) { if (nNum1 > nNum2) { nNum1 = nNum1 ^ nN ...

  3. Docker下redis的主从配置

    1.拉取redis镜像docker pull redis2.启动3个redis容器服务,分别使用到6379.6380.6381端口docker run --name redis-6379 -p 637 ...

  4. PHP中session和cookie的区别

    这个话题无论是系统运维还是PHP开发人员面试时会经常遇到,所以这里也进行一些总结和归纳,session和cookie的具体理论网上比较大,大家googel下均可;系统运维注意区分下session(会话 ...

  5. SpringBoot自定义一个starter

    @Configuration //指定这个类是一个配置类 @ConditionalOnXXX //在指定条件成立的情况下自动配置类生效 @AutoConfigureAfter //指定自动配置类的顺序 ...

  6. 【转】关于编写WPF UserControl时提示The name 'InitializeComponent' does not exist in the current contextr的解决!

    1.打开.csproj(工程)文件. 2.找到<Import Project="$(MSBuildBinPath)/Microsoft.CSharp.targets" /&g ...

  7. 数据库课程设计 PHP web实现

    纪念一下自己写的东西.. 都说很垃圾就是了 直接用XAMPP做的 菜鸟网上学的PHP和HTML <!DOCTYPE html> <html> <head> < ...

  8. 使用 隧道技术 使用http代理连接 svn:// git://

    问题点 在某些情况下  无法通过代理 用 svn 访问svn://协议例如(svn://www.qdac.cc )   故此有了此贴 远端需要一个代理 服务器 connect-tunnel -P 代理 ...

  9. 35个Redis面试题

    1.什么是redis? Redis 是一个基于内存的高性能key-value数据库. 2.Reids的特点 Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库 ...

  10. 01Ping程序的设计

    1.Ping程序设计具体设计任务 1.1 实验目的 PING程序是我们使用的比较多的用于测试网络连通性的程序.PING程序基于ICMP,使用ICMP的回送请求和回送应答来工作.由计算机网络课程知道,I ...