题目大意:我可以说,做这道题的时候,我根本没有去读题吗。我只是看了图以及输入样例及输出。就写代码了。。。
其实有些题真心不需要知道它是什么意思。。
解题思路:最小生成树(克鲁斯卡尔算法实现)
1)本题的关键在于把村庄编号由字符变成数字。
for(j = 1 ; j <= m ; ++j){
char e1;
int w;
// scanf(" %c %d",&e1,&w);
cin >> e1 >>w;
e[count].begin = b1 - 'A' + 1;
e[count].end = e1 - 'A' + 1;
e[count].weight = w;
count++;
}
2)还有要注意的地方就是输入了。对于字符与数字相间出现的情况。我是用了cin >> ch1 >>d1;,
因为我觉得这样可能会方便一些。当然,你也可以这样写:
scanf(" %c %d",&b1,&m);//%c前面的空格不能去掉。用于去除c前面的空白符(包括空格与回车)
代码如下:
/*
* 1301_1.cpp
*
* Created on: 2013年8月26日
* Author: Administrator
*/
#include <iostream>
using namespace std;
struct edge{
int begin;
int end;
int weight;
};
const int maxn = 6000;
int father[maxn];
edge e[maxn*maxn];
int find(int x){
if(x == father[x]){
return x;
}
father[x] = find(father[x]);
return father[x];
}
int kruscal(int count){
int i;
int sum = 0;
for( i = 1 ; i < maxn ; ++i){
father[i] = i;
}
for( i = 0 ; i < count ; ++i){
int fx = find(e[i].begin);
int fy = find(e[i].end);
if( fx != fy ){
father[fx] = fy;
sum += e[i].weight;
}
}
return sum;
}
bool compare(const edge& a , const edge& b){
return a.weight < b.weight;
}
int main(){
int n;
while(scanf("%d",&n)!=EOF,n){
int i,j;
int count = 0;
for( i = 1 ; i <= n - 1 ; ++i){
char b1;
int m;
scanf(" %c %d",&b1,&m);//%c前面的空格不能去掉。用于去除c前面的空白符(包括空格与回车)
// cin >> b1 >> m; -----> 这种写法也是可以的
for(j = 1 ; j <= m ; ++j){
char e1;
int w;
scanf(" %c %d",&e1,&w);
// cin >> e1 >>w;
e[count].begin = b1 - 'A' + 1;
e[count].end = e1 - 'A' + 1;
e[count].weight = w;
count++;
}
}
sort(e, e + count ,compare);
int sum = kruscal(count);
printf("%d\n",sum);
}
}