最小生成树–Jungle Roads
Description
热带岛屿拉格里山的长老有问题。几年前,大量的外国援助资金被用于修建村庄之间的额外道路。但是丛林无情地超过了道路,因此庞大的道路网络成本太高,无法维护。长老理事会必须选择停止维护一些道路。左边的地图显示了现在使用的所有道路以及每月维护这些道路的费用。当然,即使路线不象以前那样短,但在所有维修道路上的村庄之间,都需要有某种办法。首席长老想告诉长老理事会,他们每个月能花多少钱在行政管理系统中,以维护连接所有村庄的道路。这些村庄在上面的地图上标着A到I。右边的地图显示了最便宜的道路,每月216个aacms。你的任务是编写一个程序来解决这些问题。
Input
输入由一到100个数据集组成,最后一行只包含0。每个数据集开始时只包含一个数字n,即村庄数,1<n<27,村庄被标记为字母的前n个字母大写。每个数据集都由n-1行组成,从村庄标签开始,按字母顺序排列。没有最后一个村庄的路线。每个村庄的每一行都以村庄的标签开始,后面跟着一个数字k,从这个村庄到村庄,后面的字母表中有标签。如果k大于0,则这条线将继续每条k条道路的数据。每条道路的数据是道路另一端的村庄标签,其次是道路的每月维修费用。维护费用将是小于100的正整数。行中的所有数据字段都由单个空白分隔。公路网总是允许在所有村庄之间旅行。该网络将永远不会有超过75条道路。任何村庄都不会有超过15条通往其他村庄的道路(在字母之前或之后)。在下面的示例输入中,第一个数据集与上面的地图相同。
Output
每个数据集的输出为每一行一个整数:每个月用于维护连接所有村庄的公路系统的最低成本。警告:审查每一组可能的道路的蛮力解决方案不会在一分钟内完成。
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
最小生成树问题,可以选择使用prim,直接套用prim模板。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <string>
#include <stack>
#include <queue>
#include <map>
using namespace std;
const int inf=0x3f3f3f3f;
const int MAX=30;
int m[MAX][MAX],d[MAX];
int n;
bool f[MAX];
int fun()
{
int num=0;
memset(d,inf,sizeof(d));
memset(f,true,sizeof(f));
d[0]=0;
int v=-1;
while(true)
{
v=-1;
for(int i=0;i<n;i++)
if(f[i]&&(v==-1|| d[i]<d[v])) v=i;
if(v==-1) break;
f[v]=false;
num+=d[v];
for(int i=0;i<n;i++)
{
d[i]=min(d[i],m[v][i]);
}
}
return num;
}
int main()
{
while(true)
{
cin>>n;
if(n==0) break;
for(int i=0;i<26;i++)
{
for(int j=0;j<26;j++)
{
if(i==j)
m[i][j]=0;
else
m[i][j]=inf;
}
}
for(int i=1;i<n;i++)
{
char q,w;
int temp1,temp2;
cin>>q>>temp1;
while(temp1--)
{
cin>>w>>temp2;
m[q-'A'][w-'A']=temp2;
m[w-'A'][q-'A']=temp2;
}
}
cout<<fun()<<endl;
}
return 0;
}