求助,本地全过提交全RE
查看原帖
求助,本地全过提交全RE
67437
TomLovesRita楼主2024/4/23 23:26
#include <stdio.h>
#include <stdlib.h>
int minx=0x3f3f3f3f;
typedef struct node1 {
	int index;
	int num;
	int cleft;
	int cright;
}node;
typedef struct node2 {
	struct node1 data;
	struct node2 *left;
	struct node2 *right;
}tree;
tree *getnode(node x) {
	tree *cnt=(tree*)malloc(sizeof(tree));
	cnt->data.index=x.index;
	cnt->data.cleft=x.cleft;
	cnt->data.cright=x.cright;
	cnt->data.num=x.num;
	cnt->left=NULL;
	cnt->right=NULL;
}
void insert(tree **t, node x) {
	//assert(t);
	if(!(*t)) return;
	tree *cnt=NULL;
	if((*t)->data.cleft==0 && ((*t)->data.cright==0)) return;
	if((*t)->data.cleft==x.index) {
		cnt=getnode(x);
		(*t)->left=cnt;
		return ;
	}
	if((*t)->data.cright==x.index) {
		cnt=getnode(x);
		(*t)->right=cnt;
		return ;
	}
	insert(&(*t)->left, x);
	insert(&(*t)->right, x);
}
tree *search(tree *t, int x) {
	if(t) {
		if(t->data.index==x) return t;
		else {
			tree *cnt;
			cnt=search(t->left, x);
			if(!cnt) cnt=search(t->right, x);
			return cnt;
		}
	}
	return NULL;
}
tree *findLCA(tree *t, int index1, int index2) {
	if(t==NULL) return NULL;
	if(t->data.index==index1||t->data.index==index2) return t;
	tree *left_LCA=findLCA(t->left, index1, index2);
	tree *right_LCA=findLCA(t->right, index1, index2);
	if(left_LCA&&right_LCA) return t;
	return (left_LCA!=NULL)?left_LCA:right_LCA;
}
int findlevel(tree *t, int indexx, int level) {
	if(t==NULL) return -1;
	if(t->data.index==indexx) return level;
	int lev=findlevel(t->left, indexx, level+1);
	if(lev==-1) return findlevel(t->right, indexx, level+1);
	else return lev;
}
int mindis(tree *t, int index1, int index2) {
	tree *lca=findLCA(t, index1, index2);
	if(!lca) return -1;
	int dis_lca=findlevel(t, lca->data.index, 0);
	int dis_n1=findlevel(t, index1, 0);
	int dis_n2=findlevel(t, index2, 0);
	//printf("%d和%d三个距离:%d %d %d\n",index1, index2, dis_n1, dis_n2, dis_lca);
	int diss=dis_n1+dis_n2-2*dis_lca;
	return diss;
}
void inorder(tree *t) {
	if(t) {
		inorder(t->left);
		printf("%d ", t->data.index);
		inorder(t->right);
	}
}
int n;
node a;
int d=0;
tree *t=NULL;
int main() {
	scanf("%d", &n);
	scanf("%d%d%d", &a.num, &a.cleft, &a.cright);
	a.index=1;
	t=getnode(a);
	for(int i=2; i<=n; i++) {
		scanf("%d%d%d", &a.num, &a.cleft, &a.cright);
		a.index=i;
		insert(&t, a);
	}
	//inorder(t);
	//printf("\n");
	//for(int i=1; i<=n; i++) printf("%d在第%d层\n", i, findlevel(t, i, 0));
	for(int i=1; i<=n; i++) {
		//if(d<=minx) minx=d;
		d=0;
		for(int j=1; j<=n; j++) {
			tree *cnt=search(t, j);
			int k=cnt->data.num;
			//if(i==j) continue;
			//printf("%d和%d的最近公共祖先是%d\n", i, j, findLCA(t, i, j)->data.index);
			//printf("%d到%d的最小距离是:%d\n", i, j, mindis(t, i, j)*k);
			d+=mindis(t, i, j)*k;
			if(j==n&&d<=minx) minx=d; 
		}
		//printf("%d\n", d);
	}	
	printf("%d", minx);
	
	return 0;
}
2024/4/23 23:26
加载中...