1406是典型的最小生成树
最小生成树的定义相对抽象,我这里简单介绍下.
这道题的解,就是用N条变,把这些定点都连接起来,就OK了.
理论上就是最小生成树.
这道题的解放,从某一个点开始,把这点置为\"已知\"点,假设为集合A,每次都这样,找出一个端点在集合A中,另一个端点不在集合A中的所有线段中最小的一条,假设这条最小的线段的不在集合A的端点为x,把x放入集合A中,继续这样的搜索.知道所有的点都在集合A中了.
还有其他算法,大家有空看看.代码如下:
#include<stdio.h>
int main()
{
int map[101][101];
int num[101],check[101];
int i,j,k,n,l,min;
char u,v;
freopen(\"in.txt\",\"r\",stdin);
while(scanf(\"%d\",&n),n)
{
for (i=0;i<n;i++) for (j=0;j<n;j++) map[j]=0;
for (i=1;i<n;i++)
{
scanf(\"%c\",&v);
scanf(\"%c\",&v);
scanf(\"%d\",&k);
for (j=0;j<k;j++)
{
scanf(\"%c\",&u);
scanf(\"%c\",&u);
scanf(\"%d\",&l);
map[v-65][u-65]=l;
map[u-65][v-65]=l;
}
}
for (i=0;i<n;i++) check=1;
check[0]=0;
num[0]=0;
min=0;
for (i=1;i<n;i++)
{
l=10000000;
u=0;
for (j=0;j<i;j++)
{
for (k=0;k<n;k++) if(check[k] && map[num[j]][k]>0 && map[num[j]][k]<l)
{
u=k;
l=map[num[j]][k];
}
}
num=u;
check=0;
min+=l;
}
printf(\"%d\\n\",min);
}
return 0;
} |