这是一个简单的最小生成树题目 , 就是字符串输入太麻烦
注意:每个之间的空格不一定是一个,可能是多个 。
所以不能用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()
{
}