求助一些关于地址操作的问题
  • 板块学术版
  • 楼主DFSer
  • 当前回复4
  • 已保存回复4
  • 发布时间2022/7/22 15:50
  • 上次更新2023/10/27 18:54:28
查看原帖
求助一些关于地址操作的问题
189314
DFSer楼主2022/7/22 15:50

打了一个关于带边权树的模板(很烂,大佬勿喷)

想做一个路径压缩,使所有节点与根节点相连

然后一顿地址操作,RE给我整不会了

求助: 1.path函数是否本身存在问题 2.path函数是否无法修改a数组的值

3.从最后一层非叶节点,将所有子节点拉到与自己同级以达到压缩目的,这样做是否有问题?

4.while循环套for循环那段死循环的问题在哪?

萌新第一次写链式存储,对结构体地址操作还不太熟悉,求神犇帮助,谢谢!

#include <iostream>
#include <vector>

using namespace std;



struct node {
	int deep;
	vector<pair<node*,long long>> sons;
	node *p;
};

typedef pair<node*,long long> pnl;

node a[10010];

bool path (node * t){
	if(t  == NULL || t->p == NULL ||t->sons.size() == 0)return false;
	for(int j = 0;j<t->p->sons.size();j++){
		if(t->p->sons[j].first == t){
			int l1 = t->p->sons[j].second;
			for(int i = 0;i<t->sons.size();i++){
				t->sons[i].first->deep--;
				t->p->sons.push_back({t->sons[i].first,t->sons[i].second+l1});
			}
			break;
			t->p->sons.clear();
		}
	}	
	return true;
}

void work(node * r){
	int len = r->sons.size();
	if(len == 0){cout<<0;return;}
	else if(len == 1){cout<<r->sons[0].second;return;}
	long long mx,rmx;
	mx = rmx = -1;
	for(int i = 0;i<len;i++){
		if(r->sons[i].second > mx){
			rmx = mx;
			mx = r->sons[i].second;
		}else if(r->sons[i].second > rmx){
			rmx = r->sons[i].second;
		}
	}
	cout<<mx+rmx;
	return;
}

int main() {
	int n;
	cin>>n;
	for(int i = 1;i<=n;i++)a[i].deep = 1;
	int mp = 0;
	for(int i = 1; i<=n-1; i++) {
		long long x,y,z;
		cin>>x>>y>>z;
		if(y<x)swap(x,y);
		a[x].sons.push_back({&a[y],z});
		a[y].deep = a[x].deep+1;
		a[y].p = &a[x];
		mp = max(mp,a[y].deep);
	}
//	for(int i = 1;i<=n;i++){
//		cout<<a[i].deep<<" "<<(a[i].p->deep)<<" ";
//		for(int j = 0;j<a[i].sons.size();j++)cout<<a[i].sons[j].first<<" "<<a[i].sons[j].second<<endl;
//	}
	while(mp > 2){
		bool isOP = false;
		for(int i = 1;i<=n;i++){
			if(a[i].deep == mp-1){
				cout<<(&a[i])->sons.size()<<" ";
				if(path(&a[i]))isOP = true;
				cout<<(&a[i])->sons.size()<<endl;
			}
		}
		if(!isOP)mp--;
	}
//	for(int i = 1;i<=n;i++)if(a[i].deep == 1)work(&a[i]);
	return 0;
}
2022/7/22 15:50
加载中...