现在有10个强盗,下面9行两个人是一个团伙
1 2
3 4
5 2
4 6
2 6
8 7
9 7
1 6
2 4
求有几个团伙

//并查集
#include<stdio.h>
int f[1000]={0},n,m,k,sum=0;
//第一步,这里是初始,非常的重要,数组里面存自己的下标就好了(自己是自己的老大)
void init()
{int i;for(i=1;i<=n;i++)f[i]=i;return ;
}
//这是找爹的递规函数,不停的去找爹,直到找到祖宗为止,其实就是去犯罪团伙的最高领导,“擒贼先擒王”原则
int getf(int v)
{if(f[v]==v)return v;else{f[v]=getf(f[v]);//找爹循环,哈哈哈return f[v];//返回找到的值}
}
//这里是合并两子集合的函数
void merge(int v,int u)
{int t1,t2;t1=getf(v);//注意这里是getf(v),不是getf(f[v]),要不然就隔过了一层找爹循环t2=getf(u);if(t1!=t2)//判断两节点是否同一祖先{//靠左原则f[t2]=t1;}return ;
}
int main()
{int i,x,y;scanf("%d%d",&n,&m);//初始化为第一步init();//第二步合并团伙,题型可能有改动,但是万变不离其宗for(i=1;i<=m;i++){scanf("%d%d",&x,&y);merge(x,y);}   //第三步扫描有多少团伙for(i=1;i<=n;i++){if(f[i]==i)sum++;}printf("%d\n",sum);getchar();getchar();return 0;
}
//答案为3

有好几个孤岛,要把它们连起来,且花费最少
数据
6 9
2 4 11
3 5 13
4 6 3
5 6 4
2 3 6
4 5 7
1 2 1
3 4 9
1 3 2
找到n-1条边,使得n个岛连通且路程最短

//最小生成树kruskal算法
//核心:排序,选用n-1条边
#include <stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct edge
{int u,v,w;
}e[10];
int cmp(edge x,edge y)
{return x.w<y.w;
}
int n,m;
int f[7]={0},sum=0,cou=0;
int geft(int v)
{if(f[v]==v)return v;else{f[v]=geft(f[v]);return f[v];}
}
int merge(int v,int u)
{int t1,t2;t1=geft(v);t2=geft(u);if(t1!=t2){f[t2]=t1;return 1;}return 0;
}
int main()
{int i;scanf("%d%d",&n,&m);//第一步,找到一个结构体储存边的位置for(i=1;i<=m;i++)scanf("%d%d%d",&e[i].u,&e[i].v,&e[i].w);//第二步,按边的大小排序    sort(e+1,e+m+1,cmp);//第三步,初始化for(i=1;i<=n;i++)f[i]=i;//第四步,kruskal算法的核心    for(i=1;i<=m;i++){//先判断两点是否连通if(merge(e[i].u,e[i].v))//如果不连通,这条边{cou++;  sum=sum+e[i].w;}if(cou==n-1)//直到n-1条边后退出循环break;}printf("%d",sum);//打印结果getchar();getchar();return 0;
}

这个算法也采用上面那个例子;
这个算法的思想是:

//prime算法
#include<stdio.h>
int main()
{int n,m,i,j,k,minn,t1,t2,t3;int e[7][7],dis[7],book[7]= {0};//这里对book数组进行初始化int inf=999999999;//用inf(infinity的缩写)储存一我们认为的正无穷值int cou=0,sum=0;//cou用来生成树中定点的,sum用来路径之和;//读入n和m,n表示定点个数,m表示边的条数scanf("%d%d",&n,&m);//第一步,初始化for(i=1; i<=n; i++)for(j=1; j<=n; j++)if(i==j)e[i][j]=0;elsee[i][j]=inf;//第二步,读入边for(i=1; i<=m; i++){scanf("%d%d%d",&t1,&t2,&t3);e[t1][t2]=t3;e[t2][t1]=t3;}//第三步,初始化dis数组,for(i=1; i<=n; i++)dis[i]=e[1][i];//第四步,将一号点加入树    book[1]=1;//第五步,加边cou++;//第六步,prime算法核心while(cou<n)//找到n-1条边{minn=inf;for(i=1; i<=n; i++){if(book[i]==0&&dis[i]<minn)//找下一个能走的点{minn=dis[i];j=i;}}book[j]=1;cou++;sum=sum+dis[j];for(k=1; k<=n; k++){if(book[k]==0&&dis[k]>e[j][k])//找到通向这个点的最短路dis[k]=e[j][k];}//扫描当前定点j所有边,在以j为中间点,更新生成树到每一个非数定点的距离for(k=1;k<=n;k++){printf("%d ",dis[k]);}printf("\n");}printf("%d",sum);//打印结果getchar();getchar();return 0;
}

转载于:https://www.cnblogs.com/zxy160/p/7215154.html

并查集和prime和kruskal相关推荐

  1. 一口气——并查集及其在Kruskal算法的应用

    本文记录下树结构下的并查集和其在Kruskal计算最小生成树算法中的应用 一.何为并查集   并查集,顾名思义对数据进行合并和查询,因为是树结构的应用,合并即将两个数据安置在树中,查询即查询某个数据的 ...

  2. 最小生成树总结(prim、并查集和kruskal) C++实现

    <span style="font-family: 微软雅黑; widows: auto; background-color: inherit;">摘要:</sp ...

  3. 算法:最小生成树(prime,kruskal,floyd)

    最小生成树 Floyd算法O(n^3)- 动态规划 思路 f[i, j, k] 表示从i走到j的路径上除i和j点外只经过1到k的点的所有路径的最短距离.那么f[i, j, k] = min(f[i, ...

  4. 数据结构与算法A实验六图论---7-4 公路村村通(最小生成树Prime和Kruskal算法)

    现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤1000)和候选道路数目M(≤3N) ...

  5. 【浙大软件学院机试】深度优先搜索、并查集和优先级队列知识点(Python实现)

    文章目录 1 DFS模板 2 DFS例题-地下迷宫探索(深搜输出路径) 3 并查集 4 优先级队列-Huffman树 1 DFS模板 import math import cmath import s ...

  6. 天梯赛L2-010 排座位(并查集和\set)

    题目描述 布置宴席最微妙的事情,就是给前来参宴的各位宾客安排座位.无论如何,总不能把两个死对头排到同一张宴会桌旁!这个艰巨任务现在就交给你,对任何一对客人,请编写程序告诉主人他们是否能被安排同席. 输 ...

  7. 数据结构:并查集和图

    并查集 并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题. 常涉及两个基本操作: (1)合并两个不相交的集合 (2)判断两个元素是否属于同一个集合. 将N个不同元素分成一组不想交的集 ...

  8. hdu 1116 并查集和欧拉路径

    ---恢复内容开始--- 把它看成是一个图 只是需要欧拉路径就可以了 首尾能连成一条线即可 如果要判断这个图是否连通 得用并查集 在hrbust oj里面看答案学到的方法 不用各种for循环套着判断能 ...

  9. 学习笔记——拓展域并查集和带权并查集

    1,拓展域并查集 一般的并查集只能查找出各元素之间是否存在某一种相同的联系,如:a和b是亲戚关系,b和c是亲戚关系,这时就可以查找出a和c也存在亲戚关系.但如果存在多种相对的联系时一般的并查集就不行了 ...

最新文章

  1. Python实现单链表
  2. 数据库面试题【十六、优化长难的查询语句】
  3. 微课|中学生可以这样学Python(4.2节):break与continue语句
  4. Ansi,UTF8,Unicode,ASCII编码的差别
  5. python遍历json对象顺序输出_fastJson顺序遍历JSON字段
  6. 拦截图片代码 精易web浏览器_精易Web浏览器 UChk验证源码
  7. 英文名为什么最好不用joe?JOE英文名的寓意是什么?
  8. leetcode一些常用的工具的总结
  9. Python爬虫 | 2008-2018年各省专利统计数据
  10. 英译中练习:准译员如何“假装”自己很专业?丨打死个翻译官2.3
  11. 关于【野火】OV7725例程移植【OV7670】总结
  12. 掌上聊app v1.5.5
  13. 计算机诞生与发展思维导图,逻辑思维与思维导图的关系
  14. 从iQOOZ1到iQOOZ1x,iQOO何以能持续打造爆款?
  15. Ubuntu 安装中文man手册
  16. fortran教程5:数组
  17. 《Spring实战》读书笔记_装配bean
  18. html转pdf中文不显示解决方法
  19. html ie乱码,ie浏览器字体出现乱码解决方法
  20. 前端webpack打包配置

热门文章

  1. Windows2003 IIS安装
  2. CSS漂亮盒子(上)
  3. Centos7Yum安装Mysql8
  4. 山果(转载《人民日报》)
  5. python.day.10——面向对象(二)
  6. Bzoj2957: 楼房重建
  7. 发射站(2017佛山市选拔初中组)
  8. “防爆”与“防暴” 这两种摄像机差别在哪?
  9. 统计学习方法笔记 -- 概论
  10. Maven---学习心得---maven的配置文件settings.xml