Huffman编码树!!!

qq_36212387 2017-05-20 01:20:33
描述



构造一个具有n个外部节点的扩充二叉树,每个外部节点Ki有一个Wi对应,作为该外部节点的权。使得这个扩充二叉树的叶节点带权外部路径长度总和最小:

Min( W1 * L1 + W2 * L2 + W3 * L3 + … + Wn * Ln)

Wi:每个节点的权值。

Li:根节点到第i个外部叶子节点的距离。

编程计算最小外部路径长度总和。


输入第一行输入一个整数t,代表测试数据的组数。
对于每组测试数据,第一行输入一个整数n,外部节点的个数。第二行输入n个整数,代表各个外部节点的权值。
2<=N<=100
输出
输出最小外部路径长度总和。
样例输入
2
3
1 2 3
4
1 1 3 5

样例输出
9
17

下面是我的代码:
#include<stdio.h>
int main()
{
int t,n;
int w[2000],min[2000];
scanf("%d",&t);
int i,j,k;
for(i=0;i<t;i++)
{
scanf("%d",&n);
for(j=0;j<n;j++)
{
scanf("%d",w[j]);
}
int h;
for(k=0;k<n;k++)
{
for(j=0;j<n-k-1;j++)
{
if(w[j]>w[j+1])
{
h=w[j];
w[j]=w[j+1];
w[j+1]=h;
}
}
}
int q=n,sum=0;
if(n==1)
{
min[i]=w[0];
}
else
{
w[0]=w[0]*(q-1);
w[1]=w[1]*(q-1);
sum+=w[0]+w[1];
q--;
for(j=2;j<n;j++)
{
sum+=w[j]*(q-1);
q--;
}
min[i]=sum;
}
}
for(i=0;i<t;i++)
{
printf("%d",min[i]);
printf("\n");
}
return 0;
}
代码编译没错,但是运行时就出现了 文件名.exe已停止工作,请大神指点!!!

...全文
258 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_36212387 2017-05-22
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
百度搜相关关键字。
谢谢
qq_36212387 2017-05-22
  • 打赏
  • 举报
回复
引用 3 楼 cfjtaishan 的回复:
for(j=0;j<n;j++)
        {
            scanf("%d", &w[j]); /*这儿需要加一个&,因为scanf要求的是地址*/
        }
错了,错了,刚才我发的是下面这个题目的程序,但是测试答案很多组都是对的,但是交到openjudge上就是wrong answer,麻烦帮我看一下,谢谢 题目是这样子的: 树的转换 描述 我们都知道用“左儿子右兄弟”的方法可以将一棵一般的树转换为二叉树,如: 0 0 / | \ / 1 2 3 ===> 1 / \ \ 4 5 2 / \ 4 3 \ 5 现在请你将一些一般的树用这种方法转换为二叉树,并输出转换前和转换后树的高度。 输入输入包括多行,最后一行以一个#表示结束。 每行是一个由“u”和“d”组成的字符串,表示一棵树的深度优先搜索信息。比如,dudduduudu可以用来表示上文中的左树,因为搜索过程为:0 Down to 1 Up to 0 Down to 2 Down to 4 Up to 2 Down to 5 Up to 2 Up to 0 Down to 3 Up to 0。 你可以认为每棵树的结点数至少为2,并且不超过10000。输出对于每棵树,按如下格式输出转换前和转换后树的高度: Tree t: h1 => h2 其中t是树的编号(从1开始),h1是转换前树的高度,h2是转换后树的高度。 样例输入 dudduduudu ddddduuuuu dddduduuuu dddduuduuu # 样例输出 Tree 1: 2 => 4 Tree 2: 5 => 5 Tree 3: 4 => 5 Tree 4: 4 => 4
qq_36212387 2017-05-22
  • 打赏
  • 举报
回复
引用 3 楼 cfjtaishan 的回复:
for(j=0;j<n;j++)
        {
            scanf("%d", &w[j]); /*这儿需要加一个&,因为scanf要求的是地址*/
        }
这道题测试答案对了之后交到openjudge上是wrong answer,差不多找到哪里错了之后,又重新写了一个程序,测了很多组数据之后都对,但是还是错了,能麻烦给我看一下么,谢谢 这是重写的: #include<stdio.h> #include<string.h> #define N 2000 int h,len; int forest(char a[],int num_d,int num_u,int i) { num_d=0; while(a[i]=='d') {num_d++; i++;} if(num_d-num_u>=0) h+=num_d-num_u; num_u=0; while(a[i]=='u') {num_u++; i++;} if(i!=len) return forest(a,num_d,num_u,i); return h; } int tree(char a[],int depth,int num_d,int num_u,int i) { num_u=0; num_d=0; while(a[i]=='u') {num_u++; i++;} while(a[i]=='d') {num_d++; i++;} if(num_d-num_u>=0) depth+=1; if(i!=len) return tree(a,depth,num_d,num_u,i); return depth; } int main() { char a[N]; int i,j,k,t; int h1[N],h2[N]; for(i=0;;i++) { scanf("%s",a); len=strlen(a); for(j=0;j<len;j++) { if(a[j]=='u') { t=j; break; } } if(a[0]=='#') break; else { h1[i]=forest(a,0,0,0); h=0; k=h1[i]; h2[i]=tree(a,k,0,0,t); } } for(j=0;j<i;j++) { printf("Tree %d: %d => %d\n",j+1,h1[j],h2[j]); } return 0; }
赵4老师 2017-05-21
  • 打赏
  • 举报
回复
百度搜相关关键字。
自信男孩 2017-05-20
  • 打赏
  • 举报
回复
for(j=0;j<n;j++)
        {
            scanf("%d", &w[j]); /*这儿需要加一个&,因为scanf要求的是地址*/
        }
qq_36212387 2017-05-20
  • 打赏
  • 举报
回复
交到openjudge上一直是wrong answer
qq_36212387 2017-05-20
  • 打赏
  • 举报
回复
我的错找出来了,运行结果也对了,但是交上去显示wrong answer,请各位大神看看,谢谢

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧