这是一个简单的最小生成树题目 , 就是字符串输入太麻烦
注意:每个之间的空格不一定是一个,可能是多个 。
所以不能用gets , 用scanf+%c+%d也不行 ,
必须用scanf+%s+%d
代码:
#include
#include
#include
#include
using namespace std;
const int MAXN = 100;
int u[MAXN] , v[MAXN] , w[MAXN];
int p[MAXN] , n , bz[MAXN];
bool cmp(const int i , const int j)
{
return w[i]
< w[j];
}
int find(int x)
{
int y =
x;
while(x !=
p[x]) x = p[x] ;
while(y !=
x)
{
int h =
p[y];
p[y] =
x;
y = h;
}
return
x;
}
int main()
{
//printf("%d
%d\n" , '0' , '9');
while(scanf("%d" , &n) && n)
{
getchar();
int i , j =
0 , x , y , z;
char
c[10];
for(i =
1; i < n; i++)
{
scanf("%s%d"
, c , &z);
if(z ==
'0') continue ;
x =
c[0]-64;
for(int k =
0 ; k < z ; k++)
{
scanf("%s%d"
, c , &y);
cout<<c<<y<<endl;
u[j] = x;
v[j] = c[0]-64; w[j] = y;
j +=
1;
}
}
for(i = 0; i
<= 27 ; i++) p[i] = i;
for(i = 0 ;
i <= j; i++) bz[i] = i;
sort(bz , bz
+ j , cmp);
int sum = 0
;
for(i = 0 ;
i < j; i++)
{
int b =
bz[i];
x = u[b] , y
= v[b] ;
int g =
find(x) , h = find(y);
if(g !=
h)
{
p[h] =
g;
sum +=
w[b];
// max_m +=
1;
// if(max_m
== (n-1)) break;
}
}
printf("%d\n" , sum);
}
return
0;
}
注意:每个之间的空格不一定是一个,可能是多个 。
代码:
#include
#include
#include
#include
using namespace std;
const int MAXN = 100;
int u[MAXN] , v[MAXN] , w[MAXN];
int p[MAXN] , n , bz[MAXN];
bool cmp(const int i , const int j)
{
}
int find(int x)
{
}
int main()
{
}