有一个旅游区,旅游区有很多的景点,景点间需要开通缆车,使得任意两个景点可以互相到达。现在给出一些点间的缆车线路制造成本,两个景点之间可能有多重制造方式。问最少的花费是多少。
Input
输入包括多组数据,最多100组,最后以输入0表示结束。
对于每一组数据,第一行一个n,表示景区数量。1<n<27
之后n-1行,每行第一个是一个大写字母,表示当前景区的编号,接着是k,表示当前景区对外可以有k中缆车线路制造方式,接着k对,每对第一个是一个字母,表示这条路线连接的景区,第二个是一个数字,表示制造成本。0<=k<=15。最多75条制造线路,每条线路的制造成本最大是100。
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
题意思路:最小生成树模板题。
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int maxn = 28;
const int inf = 0x3f3f3f3f;
int road[maxn][maxn],dis[maxn];
bool vis[maxn];
int n;
void prime()
{
int mi,v;
for(int i=0;i<n;i++)
{
dis[i]=road[0][i];
vis[i]=false;
}
for(int i=1;i<=n;i++)
{
mi=inf;
for(int j=0;j<n;j++)
{
if(!vis[j]&&mi>dis[j])
{
mi=dis[j];
v=j;
}
}
vis[v]=true;
for(int j=0;j<n;j++)
{
if(!vis[j]&&dis[j]>road[v][j])
dis[j]=road[v][j];
}
}
for(int i=1;i<n;i++)
dis[0]+=dis[i];
cout<<dis[0]<<endl;
}
int main()
{
int k,w;
char s[5],e[5];
while(cin>>n&&n!=0)
{
memset(road,inf,sizeof(road));
for(int i=0;i<n;i++)
{
road[i][i]=0;
}
for(int i=1;i<n;i++)
{
scanf("%s%d",s,&k);
for(int j=0;j<k;j++)
{
scanf("%s%d",e,&w);
road[s[0]-'A'][e[0]-'A']=road[e[0]-'A'][s[0]-'A']=w;
}
}
prime();
}
return 0;
}
感悟:模板题要多敲。