首页 > 其他分享 >LightOJ - 1041 Road Construction(最小生成树)

LightOJ - 1041 Road Construction(最小生成树)

时间:2023-04-07 11:32:12浏览次数:43  
标签:Map 1041 int MAXNODE LightOJ Construction Edge include Type


题目大意:给你N条边,看能否形成最小生成树,如果存在,输出值,不存在,另外输出

解题思路:模版题

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <iostream>
using namespace std;
const int MAXNODE = 1010;
const int MAXEDGE = 1000010;
typedef int Type;

struct Edge{
    int u, v;
    Type d;
    Edge() {}
    Edge(int u, int v, Type d): u(u), v(v), d(d) {}
}E[MAXEDGE];

int n, m, tot, cas = 1;
int f[MAXNODE];
Type maxcost[MAXNODE][MAXNODE];
vector<Edge> G[MAXNODE];
map<string,int> Map;

//初始化并查集和最小生成树的边
void init() {
    Map.clear();
    n = 0;
    cin >> m;
    string a, b;
    int val;
    for (int i = 0; i < m; i++) {
        cin >> a >> b >> val;
        if (!Map[a]) Map[a] = ++n;
        if (!Map[b]) Map[b] = ++n;
        E[i] = Edge(Map[a], Map[b], val);
    }

    for (int i = 1; i <= n; i++) {
        f[i] = i;
        G[i].clear();
    }
}

int find(int x) {
    return x == f[x] ? x : f[x] = find(f[x]);
}

bool cmp(const Edge &a, const Edge &b) {
    return a.d < b.d;
}

//dfs找路径最大值,maxcost[i][j]维护的是树上的i到j点的路径上,最长的那条边的权值 
void dfs(int s, int u, Type Max, int fa) {
    maxcost[s][u] = max(maxcost[s][u], Max);
    for (int i = 0; i < G[u].size(); i++) {
        int v = G[u][i].v;
        if (v == fa) continue;
        double tmp = max(Max, G[u][i].d);
        dfs(s, v, tmp, u);
    }
}

//Kruskal找到最小生成树,并将最小生成树记录下来,以便后面用来求两点之间的最长边
void solve() {
    sort(E, E + m, cmp);

    Type Sum = 0;
    int num = 0;
    for (int i = 0; i < m; i++) {
        int fx = find(E[i].u);
        int fy = find(E[i].v);
        if (fx != fy) {
            f[fx] = fy;
            Sum += E[i].d;
            G[E[i].u].push_back(E[i]);
            swap(E[i].u, E[i].v);
            G[E[i].u].push_back(E[i]);
            num++;
        }
    }
    if(num != n - 1)
        cout << "Case " << cas++ << ": Impossible" << endl;
    else 
        cout << "Case " << cas++ << ": " << Sum << endl;
}

int main() {
    int test;
    cin >> test;
    while (test--) {
        init();
        solve();
    }
    return 0;
}


标签:Map,1041,int,MAXNODE,LightOJ,Construction,Edge,include,Type
From: https://blog.51cto.com/u_10970600/6175966

相关文章

  • PAT Basic 1041. 考试座位号
    PATBasic1041.考试座位号1.题目描述:每个PAT考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座......
  • 2019-2020 ICPC, Asia Jakarta L - Road Construction 网络流
    直接用城市建点的话不好表达连边的关系考虑把每条边看作左部点右部点的话朴素想法是工人,但是也不好表达工人和材料的关系发现工人的信息可以整合成一共有多少种材料,每种......
  • 每日一道思维题——CF1761C - Set Construction
    题意:存在一个n×n的01矩阵(i,j)处值为1代表Ai 是Aj的真子集,求出这个集合A思路:我们在一开始的时候将每个位置赋初值,若i处的值是j的真子集将i处的值赋值给j代码:#inc......
  • vulnhub靶场之FUNBOX: UNDER CONSTRUCTION!
    准备:攻击机:虚拟机kali、本机win10。靶机:Funbox:UnderConstruction!,下载地址:https://download.vulnhub.com/funbox/Funbox10.ova,下载后直接vbox打开即可。知识点:osComm......
  • CF1284E New Year and Castle Construction
    链接:https://www.luogu.com.cn/problem/CF1284E题目描述:给定\(n\)个点,求\(4\)个点围住另外一个点\(5\)元子集个数。(保证任意三点不共线,不存在相同的点)题解:我们可以考虑......
  • P3599 Koishi Loves Construction
    \(\mathcalLink\)首先考虑任务一。注意到前缀和互不相同\(\iff\)不存在一段区间\([l,r](l>1)\),使其和为\(0\)。因此,\(n\)应当放在第一个。考虑到剩余数总和为\(......
  • 【题解】CF1764C Doremy's City Construction
    题目传送门思路首先我们思考一个性质,由于不能有连续单调不升/不降的三个点连在一起,所以对于单个点来讲,显然要么只和比它大的连边(称为A类点),要么只和比它小的连边(称为B类点......
  • 程序设计基础实验课 单元六的题-UVA10410 TreeReconstruction 树重建
    入门指南题面:  洛谷题面:   观看的题解:https://www.cnblogs.com/jerryRey/p/4622927.html  对样例区样例画的一些图:       题目的一些争议......
  • 406.queue-reconstruction-by-height 根据身高重建队列
    问题描述406.根据身高重建队列解题思路首先根据身高对数组重新排序,再根据ki进行插入操作。排序时,需要对排序的比较方法重写,参见C++sort排序函数用法。同时,考虑到基于......
  • PAT 乙级 1041 考试座位号 (15分)
    1041考试座位号(15分)每个PAT考生在参加考试时都会被分配两个座位号,一个是试机座位,一个是考试座位。正常情况下,考生在入场时先得到试机座位号码,入座进入试机状态后,系统......