数据结构课程设计2022夏-7-3 修建道路

作者:@kuaiquxie
作者的github:https://github.com/bitebita
本文为作者原创,如需转载,请注明出处:https://www.cnblogs.com/dzwj/p/16455689.html


7-3 修建道路
 

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
 
 
 
解析:
复制代码
#include <iostream>
#include<algorithm>
using namespace std;

const int N=10100;

int g[N][N],p[N];

int find(int x){
    if(x!=p[x])
        p[x]=find(find(p[x]));
    return p[x];
}

struct node{
    int x,y,w;
}s[N];

bool cmp(node a,node b){
    return a.w<b.w;
}

int main(){
    int n,cnt=0,ans=0;
    cin>>n;

    for(int i=1;i<=n;i++)
        p[i]=i;

    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            cin>>g[i][j];
    int m;
    cin>>m;
    while(m--){
        int a,b;
        cin>>a>>b;
        p[find(a)]=find(b);
        g[a][b]=g[b][a]=0;
    }

    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(g[i][j]){
                s[cnt].x=i;
                s[cnt].y=j;
                s[cnt].w=g[i][j];
                cnt++;
            }
        }
    }

    sort(s,s+cnt,cmp);

    for(int i=0;i<cnt;i++){
        if(find(s[i].x)!=find(s[i].y)&&g[s[i].x][s[i].y]){
            p[find(s[i].x)]=s[i].y;
            ans+=s[i].w;
        }
    }

    cout<<ans<<endl;
    return 0;
}
复制代码

 

 
 
 
 
 
posted @   kuaiquxie  阅读(202)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2021-07-07 学习java 7.7
点击右上角即可分享
微信分享提示