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 from, to;
    int length;  //长度,指代问题中两地间的费用
}node;

const int maxn = 90;
node edge[maxn];
int pre[30];
int N,turn;

int cmp(const void *a, const void *b) // 比较函数
{
    return (*(node*)a).length-(*(node*)b).length;
}

inline int root( int i ) //用于判断是否两节点在同一树上
{
    while( pre[i] )
        i=pre[i];
    return i;
}

inline void input()  //输入
{
    char c1,c2;
    int i,order;
    int dis;
    turn=0;
    while(cin>>c1>>order)
    {
        for(i=0;i<order;i++)
        {
            cin>>c2>>dis;
            edge[turn].from=c1-‘A‘;
            edge[turn].to=c2-‘A‘;
            edge[turn].length=dis;
            turn++;
        }
        if( c1==‘A‘+N-2 ) //输入完成,退出
            break;
    }
    return ;
}

inline int span()
{
    memset(pre,0,sizeof(pre));
    qsort(edge,turn,sizeof(node),cmp); //根据长度排序
    int cost=0;
    int count=0;
    int pos=-1;
    int m,n;
    while(count<N-1)
    {
        do{
            pos++;
            m=root( edge[pos].from );
            n=root( edge[pos].to );
        }while(n==m);                 //用于判断是否两节点在同一树上
        cost = cost + edge[pos].length;
        pre[m]=n;             //把该节点加入这棵树
        count++;
    }
    return cost;
}

int main()
{
    while(cin>>N && N)
    {
        input();
        int flag=span();
        cout<<flag<<endl;
    }
    return 0;
}
时间: 2024-08-03 12:58:01

Hdu 1301 Jungle Roads (最小生成树)的相关文章

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 (基础最小生成树)

题目: 链接:点击打开链接 题意: 对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 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

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

裸的最小生成树 输入很蓝瘦 **并查集 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

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];//表示某