和我一开始想的一样,连了线的点做相同的标记,直到所有的点标记相同
#include <iostream>
using namespace std;
#define imax 1005
int n,a[28][28];
struct list
{
int u,v,w;
}e[imax];
int cmp(list a,list b)
{
return a.w<b.w;
}
void kruscal(int sum)
{
int vis[imax];
for(int i=1;i<=n;i++)
vis[i]=i;
int k=1,j=0;
//排序
sort(e,e+sum,cmp);
while(k<n)
{
int t1=vis[e[j].u];
int t2=vis[e[j].v];
if(vis[e[j].u]!=vis[e[j].v])
{
printf("%d->%d,%d\n",e[j].u,e[j].v,e[j].w);
k++;
for(int i=1;i<=n;i++)
{
if(vis[i]==t2)
vis[i]=t1;
}
}
j++;
}
}
int main()
{
int i,j,k,cost;
char ch;
while(scanf("%d",&n),n!=0)
{
getchar();
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
a[i][j]=imax;
for(i=1;i<n;i++)
{
scanf("%c %d",&ch,&k);
getchar();
while(k--)
{
scanf("%c %d",&ch,&cost);
getchar();
j=ch-'A'+1;
a[i][j]=cost;
}
}/*
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
printf("%4d ",a[i][j]);
printf("\n");
}*/
k=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(a[i][j]!=imax)
{
e[k].u=i;//起点
e[k].v=j;//末点
e[k].w=a[i][j];//值
k++;
}
}
}
kruscal(k);
// printf("%d\n",result);
}
//cout << "Hello, World!\n";
return 0;
}
/*
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
*/