打了一个关于带边权树的模板(很烂,大佬勿喷)
想做一个路径压缩,使所有节点与根节点相连
然后一顿地址操作,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;
}