首页 > 其他分享 >7-3 修建道路

7-3 修建道路

时间:2023-06-26 22:36:29浏览次数:28  
标签:vexnum 连通 arcs int Graph 修建 道路 村庄

N个村庄,从1到N编号,现在请您兴建一些路使得任何两个村庄彼此连通。我们称村庄A和B是连通的,当且仅当在A和B之间存在一条路,或者存在一个存在C,使得A和C之间有一条路,并且C和B是连通的。

已知在一些村庄之间已经有了一些路,您的工作是再兴建一些路,使得所有的村庄都是连通的,并且兴建的路的长度是最小的。

输入格式:

第一行是一个整数N(3<=N<=100),代表村庄的数目。后面的N行,第i行包含N个整数,这N个整数中的第j个整数是第i个村庄和第j个村庄之间的距离,距离值在[1,1000]之间。

然后是一个整数Q(0<=Q<=N*(N+1)/2)。后面给出Q行,每行包含两个整数a和b(1<=a<b<=N),表示在村庄a和b之间已经兴建了路。

输出格式:

输出一行仅有一个整数,表示为使所有的村庄连通需要新建公路的长度的最小值。

输入样例:

3
0 990 692
990 0 179
692 179 0
1
1 2
 

输出样例:

179
通过分析,我使用了构建最小生成树的Prim算法,代码如下
#include <bits/stdc++.h>
#define N 105
using namespace std;
typedef struct
{
    int vexs[N];
    int arcs[N][N];
    int vexnum, arcnum;
} Graph;//图的结构体
int D[N] = {0} ;
int visited[N] = {0} ; 
void Create_G(Graph &G)//创建图,输入结点和个节点的距离
{
    cin >> G.vexnum ;
    int i,j;
    int m=G.vexnum;
    for(i = 1; i <= m; ++i)
    {
        for(j = 1; j <=m ; ++j)
        {
            cin >> G.arcs[i][j];
        }
    }
    int n;
    cin >> n ;
    for( i = 0 ; i < n ; ++i)
    {
        int a,b;
        cin >> a >> b ;
        G.arcs[a][b] = G.arcs[b][a] = 0;//已建成的置距离为0
        visited[a]=1;
        visited[b]=1;//标记为已访问
    }
}

int Prim_Road(Graph G)//prim算法实现
{
    int i,j,k=1,mi;
    int cost = 0;
    int nums = G.vexnum;
    for(i = 1 ; i <= nums; ++i)
    {
        D[i] = G.arcs[1][i];
        visited[i] = 0 ;
    }
    D[1] = 0 ;
    visited[1] = 1 ;//初始化数组D[]存储权值,数组visited[]标记已被访问
    for(i = 1; i <= nums; ++i)
    {
        mi=INT_MAX;
       
        for(j=1;j<=nums;++j)//寻找权值最小的边,且未被访问,记录其下标为k
        {
           if(D[j]<mi&&!visited[j])
           {
            mi=D[j];
            k=j;
           }
        }
        cost += D[k]; //计算所需距离
        D[k]=0;//将k点到原点的距离置为0
        visited[k] = 1;//将k点标记为已被访问
        for(j = 1 ; j <= nums; ++j)
        {
            if(G.arcs[k][j] < D[j] && !visited[j])
            {
                D[j] = G.arcs[k][j];//更新数组D[]
            }
        }
    }
    return cost;
}
int main()
{
    Graph G;
    Create_G(G);
    cout << Prim_Road(G) << endl;
    return 0;
}

 




标签:vexnum,连通,arcs,int,Graph,修建,道路,村庄
From: https://www.cnblogs.com/xiao-hong111/p/17506990.html

相关文章

  • 数据结构课程设计2023夏7-3 修建道路
    N个村庄,从1到N编号,现在请您兴建一些路使得任何两个村庄彼此连通。我们称村庄A和B是连通的,当且仅当在A和B之间存在一条路,或者存在一个存在C,使得A和C之间有一条路,并且C和B是连通的。已知在一些村庄之间已经有了一些路,您的工作是再兴建一些路,使得所有的村庄都是连通的,并且兴建的路的......
  • LG9410 机场修建
    和@ez_lcw胡出来的做法,不需要什么高级科技。先假设没有\(1\)操作,变成初始给定若干连通块。该问题容易归约为矩阵乘法,\(A\)矩阵每行是一种颜色,\(B\)矩阵每列是一个操作。所以可以直接思考\(O(n\sqrtn)\)的做法。通过枚举做法,发现可以序列分块。对于每个块,维护散块加的答......
  • 武术世家 马保国 马保国和诸葛亮是同乡,发展道路都一样
    马保国是山东临沂人。马保国祖籍山东临沂兰陵县,到了马保国父亲这一代,才因为工作调动,举家搬到了河南南阳,所以马保国生在南阳,长在南阳,学在南阳。这就是他口音里带着正宗的河南南阳风味的原因所在。马保国,1952年生于武术世家,体重70公斤,自封浑元形意太极拳掌门。马保国在参加搏击比赛......
  • 道路翻修题解
    \(\mathcal{Description}\)给定一张无向图,为每条边定向,定义每个点的价值为出度与入度之差的绝对值,求最大价值和。对于\(40\%\)的数据,\(1\leqn,m\leq20\)。对于\(70\%\)的数据,\(1\leqn\leq17\)。对于\(90\%\)的数据,\(1\leqn\leq22\)。对于所有数据,\(1\leqn\leq25\)......
  • m基于高斯滤波和八方向sobel边缘提取的道路检测和提取算法matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:2.算法涉及理论知识概要点和线是做图像分析时两个最重要的特征,而线条往往反映了物体的轮廓,对图像中边缘线的检测是图像分割与特征提取的基础。边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明......
  • m基于高斯滤波和八方向sobel边缘提取的道路检测和提取算法matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:     2.算法涉及理论知识概要           点和线是做图像分析时两个最重要的特征,而线条往往反映了物体的轮廓,对图像中边缘线的检测是图像分割与特征提取的基础。边缘检测是图像处理和计算机视觉中的基本......
  • 道路摊铺机远程监控物联网解决方案
    道路摊铺机是一种主要用于高速公路上各种材料摊铺作业的施工设备。摊铺作业中,上下料与路面压实等工作无法实时监测,影响到道路使用寿命与行车安全,大量的建设资金可能被白白浪费掉。而在数字化智能化技术支持下,摊铺设备可以实现数字化实时监控,能够帮助用户快速进行管理控制,保证摊铺工......
  • P2052 [NOI2011] 道路修建
    题不算难,但还是有一点坑的求一条边一侧的结点数量显然可以dfs求出来,另一侧结点数就是\(n-size_i\),其中\(size_i\)是结点\(i\)的子树大小。longlongans,size[N];inlinevoiddfs(intp,intfa){ size[p]=1; for(autoi:v[p]){ if(i.to==fa)continue; dfs(i.to,p......
  • 探索数字化转型新道路!流辰信息微服务与您一起创未来!
    科技在进步,社会在发展,办公自动化也在高速发展中。数字化转型是当下企业获得长久发展的趋势之一,在信息瞬间万变的社会中,谁掌握了核心技术,谁能与时代同步,谁就能开启新的康庄大道,谁就能在转型升级的道路中越走越顺畅。流辰信息微服务关注低代码开发市场,与时俱进,升级创新,为各大、中型......
  • 中华人民共和国道路交通安全法实施条例 All In One
    中华人民共和国道路交通安全法实施条例AllInOnedemos(......