Minimum Spanning Tree.prim/kruskal(并查集)
开始了最小生成树,以简单应用为例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(并查集)的更多相关文章
- 最小生成树(Minimum Spanning Tree)——Prim算法与Kruskal算法+并查集
最小生成树——Minimum Spanning Tree,是图论中比较重要的模型,通常用于解决实际生活中的路径代价最小一类的问题.我们首先用通俗的语言解释它的定义: 对于有n个节点的有权无向连通图,寻 ...
- Connect the Campus (Uva 10397 Prim || Kruskal + 并查集)
题意:给出n个点的坐标,要把n个点连通,使得总距离最小,可是有m对点已经连接,输入m,和m组a和b,表示a和b两点已经连接. 思路:两种做法.(1)用prim算法时,输入a,b.令mp[a][b]=0 ...
- 最小生成树 (Minimum Spanning Tree,MST) --- Kruskal算法
本文链接:http://www.cnblogs.com/Ash-ly/p/5409265.html 引导问题: 假设要在N个城市之间建立通信联络网,则连通N个城市只需要N - 1条线路.这时,自然会考 ...
- 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 ...
- 【HDU 4408】Minimum Spanning Tree(最小生成树计数)
Problem Description XXX is very interested in algorithm. After learning the Prim algorithm and Krusk ...
- 数据结构与算法分析–Minimum Spanning Tree(最小生成树)
给定一个无向图,如果他的某个子图中,任意两个顶点都能互相连通并且是一棵树,那么这棵树就叫做生成树(spanning tree). 如果边上有权值,那么使得边权和最小的生成树叫做最小生成树(MST,Mi ...
- HDU 4408 Minimum Spanning Tree 最小生成树计数
Minimum Spanning Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- 说说最小生成树(Minimum Spanning Tree)
minimum spanning tree(MST) 最小生成树是连通无向带权图的一个子图,要求 能够连接图中的所有顶点.无环.路径的权重和为所有路径中最小的. graph-cut 对图的一个切割或者 ...
- hdu 4408 Minimum Spanning Tree
Problem Description XXX is very interested in algorithm. After learning the Prim algorithm and Krusk ...
随机推荐
- Quartz使用一 通过getJobDataMap传递数据
Quartz定时器使用比较广泛,介绍一点简单的使用 上代码:定义一个Job,执行具体的任务 package org.tonny.quartz; import java.text.SimpleDateF ...
- Android从图库选择照片
从机里取照片,开头用网上找的代码测试,导致类似下面这样的Crash:java.lang.RuntimeException: Failure delivering result java.lang.Se ...
- 洛谷 P2053 [SCOI2007]修车
题目描述 同一时刻有N位车主带着他们的爱车来到了汽车维修中心.维修中心共有M位技术人员,不同的技术人员对不同的车进行维修所用的时间是不同的.现在需要安排这M位技术人员所维修的车及顺序,使得顾客平均等待 ...
- COGS 942. [東方S3] 比那名居天子
Problem 1 比那名居天子(tenshi.cpp/c/pas) 题目描述 在幻想乡,比那名居天子是管理着『要石』的天人.『要石』是能够引发和镇压地震的存在,当然也可以用来改变地形.因为在幻想乡引 ...
- 如何通过Java代码判断当前的环境是否支持JRE 9
JDK9已经出来有一段时间了,因此很多流行的Java应用纷纷增添了对JDK9乃至JDK10的支持,比如Tomcat. 我们通过这个链接下载最新的Tomcat源文件包,总共7MB: https://to ...
- 骑芯供应链(T 面试)
1.目前市面上主流的团队开发模式是什么? 正解:DevOps,https://blog.csdn.net/bntX2jSQfEHy7/article/details/79168865 2.你觉得什么是 ...
- Metinfo 5.3.19管理员密码重置漏洞复现
Metinfo 5.3.19管理员密码重置漏洞 操作系统:Windows 10专业版 kali linux 网站环境:UPUPW 5.3 使用工具:burpsuite 1.7 beta 漏洞分 ...
- forward reference extends over definition of value
在scala代码中定义了一个方法,,刚开始直接代码中报错,,后来编译是一直报错,最后只是在sc.stop后边加了一个中括号解决,方法体不能放在main主函数中
- Hibernate初始化环境的基本封装
public class HibernateUtils { private static SessionFactory sf; static{ sf = new Configuration().con ...
- Perl 安装 JSON 包
$tar xvfz JSON.tar.gz $cd JSON $perl Makefile.PL $make $make install