畅通工程

本文介绍如何使用并查集算法解决一个城镇间的道路连接问题,以达到任意两城镇间均可实现交通的目标。通过具体实例展示算法实现过程,并提供完整的代码示例。

某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?
Input
测试输入包含若干测试用例。每个测试用例的第1行给出两个正整数,分别是城镇数目N ( < 1000 )和道路数目M;随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号。为简单起见,城镇从1到N编号。
注意:两个城市之间可以有多条道路相通,也就是说
3 3
1 2
1 2
2 1
这种输入也是合法的
当N为0时,输入结束,该用例不被处理。
Output
对每个测试用例,在1行里输出最少还需要建设的道路数目。
Sample Input
4 2
1 3
4 3
3 3
1 2
1 3
2 3
5 2
1 2
3 5
999 0
0
Sample Output
1
0
2
998
分析:

并查集的简单应用 很好的模板套用 只要把题目理解正确就行了

并查集的模板

int find(int x)
{
	int r=x;
	while(r!=pre[r])
	r=pre[r];
	return r;	
} 
void mix(int x,int y)
{
	int fx=find(x),fy=find(y);
	if(fx!=fy)
	 pre[fy]=fx;
}

代码总览:

#include <stdio.h>
int pre[1000 ];

int find(int x)

{

    int r=x;

   while (pre[r ]!=r)

   r=pre[r ];

   int i=x; int j;

   while(i!=r)

   {

       j=pre[i ];

       pre[i ]=r;

       i=j;

   }

   return r;

}

int main()

{

   int n,m,p1,p2,i,total,f1,f2;

   while(scanf("%d",&n) && n)         //读入n,如果n为0,结束 

   {      //刚开始的时候,有n个城镇,一条路都没有,那么要修n-1条路才能把它们连起来

       total=n-1;

       //每个点互相独立,自成一个集合,从1编号到n 所以每个点的上级都是自己

       for(i=1;i<=n;i++) { pre[i ]=i; }                //共有m条路

       scanf("%d",&m); while(m--)

       { //下面这段代码,其实就是join函数,只是稍作改动以适应题目要求

           //每读入一条路,看它的端点p1,p2是否已经在一个连通分支里了

           scanf("%d %d",&p1,&p2);

           f1=find(p1);

           f2=find(p2);

               //如果是不连通的,那么把这两个分支连起来

               //分支的总数就减少了1,还需建的路也就减了1

           if(f1!=f2)

            {

               pre[f2 ]=f1;

               total--;

           }

           //如果两点已经连通了,那么这条路只是在图上增加了一个环 对连通性
           //没有任何影响,无视掉

       }

//最后输出还要修的路条数
       printf("%d\n",total);

   }

   return 0;

}


//畅销工程
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int pre[1200],mark[1200];
int find(int x)
{
	int r=x;
	while(r!=pre[r])
	r=pre[r];
	return r;	
} 
void mix(int x,int y)
{
	int fx=find(x),fy=find(y);
	if(fx!=fy)
	 pre[fy]=fx;
}
void init()
{
  for(int i=1;i<=1200;i++)
  {pre[i]=i;//初始化 每个元素都是自己的根结点
   mark[i]=0;	
  } 
}
int main()
{
	int m,n,a,b,i,ans;
	while(scanf("%d %d",&m,&n)!=EOF&&m){
	    init();	
	    for(i=0;i<n;i++)
		{
			scanf("%d %d",&a,&b);
			mix(a,b);//处理根节点 想让a,b之间有关系,让他们的根结点(老大)之间有关系 
		}
		for(i=1;i<=m;i++)
		mark[find(i)]=1;//标记根节点 
		for(ans=0,i=1;i<=m;i++)
		if(mark[i])
		ans++;
		printf("%d\n",ans-1);
	}
	return 0;
}
标题基于Python的自主学习系统后端设计与实现AI更换标题第1章引言介绍自主学习系统的研究背景、意义、现状以及本文的研究方法和创新点。1.1研究背景与意义阐述自主学习系统在教育技术领域的重要性和应用价值。1.2国内外研究现状分析国内外在自主学习系统后端技术方面的研究进展。1.3研究方法与创新点概述本文采用Python技术栈的设计方法和系统创新点。第2章相关理论与技术总结自主学习系统后端开发的相关理论和技术基础。2.1自主学习系统理论阐述自主学习系统的定义、特征和理论基础。2.2Python后端技术栈介绍DjangoFlask等Python后端框架及其适用场景。2.3数据库技术讨论关系型和非关系型数据库在系统中的应用方案。第3章系统设计与实现详细介绍自主学习系统后端的设计方案和实现过程。3.1系统架构设计提出基于微服务的系统架构设计方案。3.2核心模块设计详细说明用户管理、学习资源管理、进度跟踪等核心模块设计。3.3关键技术实现阐述个性化推荐算法、学习行为分析等关键技术的实现。第4章系统测试与评估对系统进行功能测试和性能评估。4.1测试环境与方法介绍测试环境配置和采用的测试方法。4.2功能测试结果展示各功能模块的测试结果和问题修复情况。4.3性能评估分析分析系统在高并发等场景下的性能表现。第5章结论与展望总结研究成果并提出未来改进方向。5.1研究结论概括系统设计的主要成果和技术创新。5.2未来展望指出系统局限性并提出后续优化方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值