最小生成树 || HDU 1301 Jungle Roads

裸的最小生成树

输入很蓝瘦

**并查集

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

找到x在并查集里的根结点,如果两个端点在同一个集合内,find之后两个值就相等了

每次找到权值最小的端点不在同一集合的边 把两个集合合并

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int fa[33];
struct node
{
    int s, e, d;
}l[111];
bool cmp(node x, node y)
{
    if(x.d != y.d) return x.d < y.d;
}
int find(int x)
{
    return x == fa[x] ? x : fa[x] = find(fa[x]);
}
int main()
{
    while(1)
    {
        int n, i, j, x, val, sum = 0, cnt = 0;//cnt是边数
        char c;
        scanf("%d", &n);
        if(n == 0) break;
        for(i = 0; i < n - 1; i++)
        {
            scanf(" %c", &c);
            int s = c - ‘A‘ + 1;
            scanf("%d", &x);
            for(j = 0; j < x; j++)
            {
                scanf(" %c %d", &c, &val);
                int e = c - ‘A‘ + 1;
                l[cnt++] = (node){s, e, val};
            }
        }
        sort(l, l + cnt, cmp);
        for(int i = 1; i <= n; i++)
            fa[i] = i;
        for(int i = 0; i < cnt; i++)
        {
            int fs = find(l[i].s), fe = find(l[i].e);
            if(fs == fe) continue;
            sum += l[i].d;
            fa[fs] = fe;
        }
        printf("%d\n", sum);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/pinkglightning/p/8428656.html

时间: 2024-10-11 09:14:07

最小生成树 || HDU 1301 Jungle Roads的相关文章

hdu 1301 Jungle Roads (基础最小生成树)

题目: 链接:点击打开链接 题意: 对n个村庄之间的路进行修理, 然后是n-1行,每行的第一组数据时一个大写字母VIL和一个数K,Vil表示从这个村庄出发,K表示刚才的那个字母代表的村庄和其他村庄的路的数目,接下来在同一行是K组数据,每组是一个大写字母和一个数,大写字母表示和第一个村庄连接的村庄,数表示维修他们之间的路所需的费用.现在为了使维修费油最低,只需所维修的路使每个村庄都是直接或间接的连接即可,求最小的费用. 思路: 只需把输入数据处理好即可.其他都是kruskal模板.' 代码: #i

hdu 1301 Jungle Roads

链接:hdu 1301 题意:n个村庄,已知n-1村庄分别到其他村庄修路的费用,求是n个村庄连通的最小费用 分析:这个是最小生成树的题,只不过村庄的编号为A-Z的大写字母,操作比较麻烦,可以将其对应转化为1-26, 这样就与普通的最小生成树题一样了 #include<cstdio> #include<algorithm> using namespace std; int f[50],n,m; struct stu { int a,b,c; }t[300]; int cmp(stru

HDU - 1301 - Jungle Roads (最小生成树!!prim算法!!)

Jungle Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4572    Accepted Submission(s): 3354 Problem Description The Head Elder of the tropical island of Lagrishan has a problem. A burst o

hdu 1301 Jungle Roads 一个很水的题 AC率也可以知道了 但是题目很难理解啊 英语渣o(╯□╰)oKruskal算法

Jungle Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4725    Accepted Submission(s): 3471 Problem Description The Head Elder of the tropical island of Lagrishan has a problem. A burst o

HDU 1301:Jungle Roads【Prim】

  Jungle Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 5516    Accepted Submission(s): 3981 Problem Description The Head Elder of the tropical island of Lagrishan has a problem. A burst

hdu 1301 Jungle Roads 最小生成树

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1301 The Head Elder of the tropical island of Lagrishan has a problem. A burst of foreign aid money was spent on extra roads between villages some years ago. But the jungle overtakes roads relentlessly,

Hdu 1301 Jungle Roads (最小生成树)

地址:http://acm.hdu.edu.cn/showproblem.php?pid=1301 很明显,这是一道“赤裸裸”的最小生成树的问题: 我这里采用了Kruskal算法,当然用Prim算法也一样可以解题. #include <iostream> #include <cstring> #include <cstdio> #include <cstdlib> using namespace std; typedef struct node{ int f

HDOJ 1301 Jungle Roads

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1301 //HDOJ1301 #include<iostream>#include<cstring> using namespace std; #define MAX 99999 #define LEN 30 int dist[LEN];//某点的权值 起始点到目标点的权值 int map[LEN][LEN];//某点到某点两点之间的权值 bool isvisitd[LEN];//表示某

hdu 301 Jungle Roads (最小生成树)

Jungle Roads Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 4073    Accepted Submission(s): 2970 Problem Description The Head Elder of the tropical island of Lagrishan has a problem. A burst of