首页 > 其他分享 >畅通工程之最低成本建设问题 (30分)

畅通工程之最低成本建设问题 (30分)

时间:2023-05-30 16:37:55浏览次数:52  
标签:pre int 样例 30 最低 son edge 畅通 root


某地区经过对城镇交通状况的调查,得到现有城镇间快速道路的统计数据,并提出“畅通工程”的目标:使整个地区任何两个城镇间都可以实现快速交通(但不一定有直接的快速道路相连,只要互相间接通过快速路可达即可)。现得到城镇道路统计表,表中列出了有可能建设成快速路的若干条道路的成本,求畅通工程需要的最低成本。
输入格式:

输入的第一行给出城镇数目N (1<N≤1000)和候选道路数目M≤3N;随后的M行,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号(从1编号到N)以及该道路改建的预算成本。
输出格式:

输出畅通工程需要的最低成本。如果输入数据不足以保证畅通,则输出“Impossible”。
输入样例1:

6 15
1 2 5
1 3 3
1 4 7
1 5 4
1 6 2
2 3 4
2 4 6
2 5 2
2 6 6
3 4 6
3 5 1
3 6 1
4 5 10
4 6 8
5 6 3

输出样例1:

12

输入样例2:

5 4
1 2 1
2 3 2
3 1 3
4 5 4

输出样例2:

Impossible

这道题显然是最小生成树,学过数

据结构的话肯定是学过的,主要问

题在于你还记得吗…

这道题我用的是克鲁斯卡尔算法,定义了一个结构体数组,用来把每一个边都存起来,同时被存放的还有两个顶点以及边权.因为克鲁斯卡尔算法是每次从最小的边权里拿出来一个,所以把结构体数组按照边权排序.最后只要新拿到的边的两个顶点不在同一个集合内,也就是未曾搭建公路以使这两个顶点联通,那么就通过并查集里的join()函数让两个点联通,同时让ans加上边权.如果最终答案并不能使得图联通,也没有关系,只需要判断是否所有顶点都在同意集合内即可.

说实话,我并查集和克鲁斯卡尔算法早已经忘了,不过好在有一个代码模板文档,里面不讲述算法如何使用,只给算法的实现代码,靠着这个文档,我竟然做出来了这道题.

//
// Created by TIGA_HUANG on 2020/9/24.
//

#include <iostream>
#include <algorithm>

using namespace std;

int pre[1010];               //存放第i个元素的父节点
int union_search(int root) {                  //查找根结点
    int son, tmp;
    son = root;
    while (root != pre[root])                 //寻找根结点
        root = pre[root];
    while (son != root) {                     //路径压缩
        tmp = pre[son];
        pre[son] = root;
        son = tmp;
    }

    return root;
}


void join(int root1, int root2) {        //判断是否连通,不连通就合并
    int x, y;
    x = union_search(root1);
    y = union_search(root2);
    if (x != y)                          //如果不连通,就把它们所在的连通分支合并
        pre[x] = y;
}

int N, M;
struct Edge {
    int a, b;
    int length;
} edge[3005];

bool operator<(Edge &x, Edge &y) {
    return x.length < y.length;
}

int ans;

void kruskal() {
    ans = 0;
    for (int i = 0; i < M; ++i) {
        if (union_search(edge[i].a) != union_search(edge[i].b)) {
            join(edge[i].a, edge[i].b);
            ans += edge[i].length;
        }
    }
}
void init() {
    for (int i = 0; i <= N; ++i) {
        pre[i] = i;
    }
}
int main() {
    cin >> N >> M;
    for (int i = 0; i < M; ++i) {
        cin >> edge[i].a >> edge[i].b >> edge[i].length;
    }
    sort(edge, edge + M);
    init();
    kruskal();
    bool flag = true;
    for (int i = 2; i <= N; ++i) {
        if (union_search(i - 1) != union_search(i)) {
            flag = false;
            break;
        }
    }
    if (flag) {
        cout << ans << '\n';
    } else {
        cout << "Impossible\n";
    }
    return 0;
}

这是我参考的代码模板文档,说是参考几乎就是把里面的代码来了个复制粘贴

畅通工程之最低成本建设问题 (30分)_结点


畅通工程之最低成本建设问题 (30分)_畅通工程_02


标签:pre,int,样例,30,最低,son,edge,畅通,root
From: https://blog.51cto.com/u_16144724/6380333

相关文章

  • 基于词频的文件相似度 (30分)
    实现一种简单原始的文件相似度计算,即以两文件的公共词汇占总词汇的比例来定义相似度。为简化问题,这里不考虑中文(因为分词太难了),只考虑长度不小于3、且不超过10的英文单词,长度超过10的只考虑前10个字母。输入格式:输入首先给出正整数N(≤100),为文件总数。随后按以下格式给出每个文件......
  • 2023-05-30 taro如何切换到其他已发布的小程序
    taro可以把一套小程序代码发布成多个小程序,那么要如何维护这些小程序呢,咱也不懂,咱也是刚开始学习怎么操作。开始前先感谢chatGpt这个工具,它真的很棒,几乎没有什么是它不会的,我的很多一些问题都是问chatGpt,就比如这篇文章都是chatGpt给我的。要将Taro项目切换到已经发布的小程序,需......
  • 2023-05-30 前端通过node获取七牛云的token(token最好还是在后端返回,前端获取token会暴
    constfs=require('fs');constqiniu=require('qiniu');varaccessKey='你的accessKey';varsecretKey='你的secretKey';varmac=newqiniu.auth.digest.Mac(accessKey,secretKey);//获取七牛tokenvaroptions={......
  • 2023-05-30 浅试nodejs实现登录接口业务(未完,待测试)
    constexpress=require('express');constbodyParser=require('body-parser');constmysql=require('mysql');//创建MySQL连接池constpool=mysql.createPool({host:'localhost',user:'root',password......
  • [ABC302F]MergeSet
    AGC010BBoxes这道题其实是一道01BFS求最短路的模型,但是建模比较难想。首先需要想到对于每个集合内的点两两连边,边权为\(1\),由于开始和结束时需要从起点到中转点和中转点到终点,而我们要求的其实是中转点的数量,如果我们直接求一遍最短路(这样的话用的是普通bfs),中准点之间是an......
  • 代码随想录算法训练营第二十一天|530. 二叉搜索树的最小绝对差、
    【参考链接】530.二叉搜索树的最小绝对差【注意】1.二叉搜索树采用中序遍历,其实就是一个有序数组。2.使用双指针,更快。【代码】1#Definitionforabinarytreenode.2#classTreeNode(object):3#def__init__(self,val=0,left=None,right=None):4#......
  • C/C++学生成绩管理系统[2023-05-30]
    C/C++学生成绩管理系统[2023-05-30]学生成绩管理系统设计----高级语言课程设计题目问题描述:设学生信息包括:学号、姓名、期末成绩、平时成绩,对学生的学习成绩信息进行管理。设计要求:实现学生信息的录入、修改、插入、删除、查询、计算总评成绩、根据总评成绩排序和划分等级、......
  • solidworks笔记20230530
    教程文件位置在帮助中用activeX打开文件,然后点另存为,对话框出现后,复制路径,取消关闭对话框。将复制的路径保存到文件浏览器中。比如我的教程文件的位置是:C:\Users\Public\Documents\SOLIDWORKS\SOLIDWORKS2022\samples\tutorial\步路模板步路模板,就是装配体模板,和修改装配体......
  • 2023-05-30 前端h5页面如何实现调起微信支付功能(该回答来自chatgpt,实际效果未测试)
    前端H5页面调起微信支付功能需要结合微信JS-SDK和后端接口实现。以下是基本步骤和示例代码:1.获取微信公众号的appid和secret在微信公众平台上创建一个公众号,获取其对应的appid和secret。2.引入微信JS-SDK将微信JS-SDK的链接放入HTML文件的头部,例如:<scriptsrc="https://res.......
  • 代码随想录算法训练营第21天 | ● 530.二叉搜索树的最小绝对差 ● 501.二叉搜索树中
     第六章 二叉树part07今日内容    详细布置   530.二叉搜索树的最小绝对差  需要领悟一下二叉树遍历上双指针操作,优先掌握递归 题目链接/文章讲解:视频讲解:  501.二叉搜索树中的众数  和 530差不多双指针思路,不过 这里涉及到一个很巧妙的代码......