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 ...
随机推荐
- calc() 计算CSS属性值
calc()是css3的一个新增的功能,用来指定元素的长度.比如说,你可以使用calc()给元素的border.margin.pading.font-size和width等属性设置动态值.calc() ...
- Ajax深入理解
Ajax Asynchronous JavaScript and XML 异步的JavaScript和XML ajax通过与后台服务器进行少量的数据交换,ajax可以使页面实现异步更新,即不需要重新 ...
- VC++编译出错:LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
解决方法: 1.搜索C盘下的cvtres.exe,结果得到类似这样的列表: C:\Program Files\Microsoft Visual Studio 10.0\VC\bin C:\Window ...
- casting in C++
这是2013年写的一篇旧文,放在gegahost.net上面 http://raison.gegahost.net/?p=39 February 20, 2013 casting in C++ Fil ...
- COGS 827. [Tyvj Feb11] 网站计划
输入文件:web.in 输出文件:web.out 简单对比时间限制:1 s 内存限制:128 MB 描述 Description Tyvj的Admin--zhq同学将在寒假开始实行 ...
- 【人工智能系列】python的Quepy库的学习
第一篇 了解 什么是Quepy quepy是一个Python框架改造自然语言问题在数据库查询语言查询.它可以很容易地定制不同类型的问题,在自然语言和数据库查询.因此,用很少的代码,你可以建立自己的系统 ...
- vue 组件内 directives指令的调用方式 <base-table v-auto-height:tableHeight="{vm:this, diffHeight:ahTable.diffHeight}"
vue 组件内 directives指令的调用方式 <base-table v-auto-height:tableHeight="{vm:this, diffHeight:ahTabl ...
- java_日期和时间
1.System类中的currentTimeMillis:1970年1.1到现在的毫秒数 public class DateTest { public static void main(String[ ...
- python爬虫---从零开始(五)pyQuery库
什么是pyQuery: 强大又灵活的网页解析库.如果你觉得正则写起来太麻烦(我不会写正则),如果你觉得BeautifulSoup的语法太难记,如果你熟悉JQuery的语法,那么PyQuery就是你最佳 ...
- 用固定长度的数组实现stack queue
package my_basic.class_3; /** * 用数组结构实现大小固定的队列和栈 */ public class Code_01_Array_stack_queue { public ...