Jungle Roads(最小生成树)

简介: Jungle Roads(最小生成树)

题目:

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, so the large road network is too expensive to maintain. The Council of Elders must choose to stop maintaining some roads. The map above on the left shows all the roads in use now and the cost in aacms per month to maintain them. Of course there needs to be some way to get between all the villages on maintained roads, even if the route is not as short as before. The Chief Elder would like to tell the Council of Elders what would be the smallest amount they could spend in aacms per month to maintain roads that would connect all the villages. The villages are labeled A through I in the maps above. The map on the right shows the roads that could be maintained most cheaply, for 216 aacms per month. Your task is to write a program that will solve such problems.

Input

The input consists of one to 100 data sets, followed by a final line containing only 0. Each data set starts with a line containing only a number n, which is the number of villages, 1 < n < 27, and the villages are labeled with the first n letters of the alphabet, capitalized. Each data set is completed with n-1 lines that start with village labels in alphabetical order. There is no line for the last village. Each line for a village starts with the village label followed by a number, k, of roads from this village to villages with labels later in the alphabet. If k is greater than 0, the line continues with data for each of the k roads. The data for each road is the village label for the other end of the road followed by the monthly maintenance cost in aacms for the road. Maintenance costs will be positive integers less than 100. All data fields in the row are separated by single blanks. The road network will always allow travel between all the villages. The network will never have more than 75 roads. No village will have more than 15 roads going to other villages (before or after in the alphabet). In the sample input below, the first data set goes with the map above.

Output

The output is one integer per line for each data set: the minimum cost in aacms per month to maintain a road system that connect all the villages. Caution: A brute force solution that examines every possible set of roads will not finish within the one minute time limit.

Sample Input

9
A 2 B 12 I 25
B 3 C 10 H 40 I 8
C 2 D 18 G 55
D 1 E 44
E 2 F 60 G 38
F 0
G 1 H 35
H 1 I 35
3
A 2 B 10 C 40
B 1 C 20
0

Sample Output

216
30

题目描述:

首先输入n代表有n个点,然后输入n-1行,每一行第一个字母和数字m代表这个字母到其他字母有m个路线,后面的是第一个字母到那个字母和具体距离是多少,然后构建一个无向图,求所有点连接起来的最短距离。

注意:每一个字母要以字符串的形式输入,不然会超时(字符串遇到空格会自动结束)。

程序代码:

#include<stdio.h>
#include<string.h>
int e[50][50],dis[1000],book[1000];
int main()
{
  int n,m,i,j,k,t,min;
  int count,sum,c,b;
  char s1[5],s[5];
  int inf=99999999;
  while(scanf("%d",&n)!=EOF)
  {
    if(n==0)
      break;
    getchar();
    memset(e,0,sizeof(e));
    memset(dis,0,sizeof(dis));
    memset(book,0,sizeof(book));
    count=sum=0;
    for(i=1;i<=n;i++)
      for(j=1;j<=n;j++)
      {
        if(i==j)
          e[i][j]=0;
        else
          e[i][j]=inf;
      }
    for(i=1;i<n;i++)
    {
      scanf("%s%d",s,&m);
      b=s[0]-'A'+1;
      for(j=1;j<=m;j++)
      {
        scanf("%s%d",s1,&t);
        c=s1[0]-'A'+1;
        e[b][c]=e[c][b]=t;
      }
    }
    for(i=1;i<=n;i++)
      dis[i]=e[1][i];
    book[1]=1;
    count++;
    while(count<n)
    {
      min=inf;
      for(i=1;i<=n;i++)
      {
        if(book[i]==0&&dis[i]<min)
        {
          min=dis[i];
          j=i;
        }
      }
      book[j]=1;
      count++;
      sum=sum+dis[j];
      for(k=1;k<=n;k++)
      {
        if(book[k]==0&&dis[k]>e[j][k])
          dis[k]=e[j][k];
      }
    }
    printf("%d\n",sum); 
  }
  return 0; 
} 
相关文章
|
数据可视化 测试技术
深入理解软件测试中的风险评估方法
【4月更文挑战第19天】 在软件开发的生命周期中,风险评估是确保产品质量和项目成功的关键步骤。本文将探讨几种常用的软件测试风险评估方法,包括定性分析和定量分析,并讨论它们在不同类型的测试环境中的应用。通过案例研究和最佳实践,我们将展示如何有效识别、评估和管理测试过程中可能遇到的风险,以及如何制定相应的缓解策略,以优化资源分配和提高测试效率。
592 0
|
6月前
|
Kubernetes 流计算 容器
|
JavaScript 前端开发 UED
深入理解JavaScript中的节流与防抖技术
理解并合理运用节流与防抖技术,可以帮助我们优化事件处理函数的执行频率,从而提升应用的性能和用户体验。这两种技术通过减少不必要的计算和DOM操作,使得Web应用程序能够更加流畅地运行。 通过掌握防抖和节流的实现原理及应用场景,开发者可以更加灵活地编写高效且性能优化的代码,对于面对高频事件处理时尤其重要。在开发中合理选择使用防抖或节流,将直接影响到应用的响应性和效率。
162 1
|
存储 测试技术 编译器
面向 C++ 的现代 CMake 教程(三)(5)
面向 C++ 的现代 CMake 教程(三)
219 1
|
机器学习/深度学习 决策智能
什么是贝叶斯网络?原理入门
什么是贝叶斯网络?原理入门
656 0
什么是贝叶斯网络?原理入门
|
设计模式 自然语言处理 Java
递归下降解析器的设计与实现
递归下降解析器的设计与实现
|
机器学习/深度学习 人工智能 算法
自动化测试的演进与实践
随着软件行业的飞速发展,传统的手工测试方式已无法满足日益增长的软件质量保证需求。自动化测试作为提高软件测试效率和质量的关键工具,其发展和应用受到业界广泛关注。本文旨在探讨自动化测试技术的发展历程、面临的挑战及未来的发展方向。通过分析自动化测试的优势与局限,结合最新的行业数据和研究结果,揭示自动化测试在现代软件开发中的核心地位及其实践价值。
151 0
|
机器学习/深度学习 数据采集 数据可视化
R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化(上)
R语言逻辑回归、决策树、随机森林、神经网络预测患者心脏病数据混淆矩阵可视化
|
算法
ChatGPT绘图指南:DALL.E3玩法大全(一)
ChatGPT绘图指南:DALL.E3玩法大全(一)
440 0
|
关系型数据库 MySQL 分布式数据库
什么是 WAL
什么是 WAL
568 0

热门文章

最新文章