帮看看下,哪里错了。。

gbvet65 2011-11-02 05:03:02
数据结构与算法实验题 6.1 最近公共祖先问题
★问题描述:
设计一个算法,对于给定的树中两个节点返回他们的最近公共祖先。
★实验任务
对于给定的树和树中节点,计算节点对的最近公共祖先。
★数据输入
第 1 行有一个正整数 n(1<n<1000),表示给定的树有 n 个节点,编号为 1,2,…,n,
编号为1 的顶点是树根。接下来的 n行中,第 i+1行描述与 i节点相关联的子节点的信息。
每行的第 1 个正整数 k 表示该节点的儿子节点数。其后第 k 个数中,每一个数表示一个儿
子节点的编号,当 k=0 时表示相应的节点是叶节点。
文件的第 n+2 行是一个正整数 m(1<m<100),表示要计算最近公共祖先的 m 个节
点对。接下来的 m 行,每行两个正整数,计算最近公共祖先的节点编号。
★数据输出
将计算出的m个节点对的最近公共祖先节点编号输出。每行3个整数,前两个是节点对
编号,第三个是他们的最近公共祖先节点编号。

#include<iostream>
#include<vector>
using namespace std;


int father(vector<int> & ,int ,int );//求公共祖先函数


int main(){
int n,i,k;
i=0;
int t,tt;

cin>>n;
vector<int >v(n); //父亲数组
while(n--){
cin>>t;
while(t--){
cin>>tt;
v[tt-1]=i+1;
}
i++;
} //给父亲数组赋值

k=v.size ();
while(k--){
cout<<v[k]<<" ";
}
cout<<endl;


int k1,k2;
cin>>k;
vector<int >z;//创建一个数组,包含结点对编号及结点对信息
while(k--){
cin>>k1>>k2;
z.push_back (k1);
z.push_back (k2);
z.push_back (father(v,k1,k2));
}

for(int a=0;a<z.size ();a++){
cout<<z[a]<<" "<<z[a+1]<<" "<<z[a+2]<<endl;
}




return 0;
}


int father(vector<int> & vv,int x ,int y){
vector<int >xx,yy;
xx[0]=yy[0]=1;
int t=1;


while(vv[x-1]!=0){//遍历父亲数组,找到所有父结点并附到数组xx
xx.push_back(vv[x-1]);
x=vv[x-1];
}
while(vv[y-1]!=0){
yy.push_back(vv[y-1]);
y=vv[y-1];
}


for(int a=0;a<xx.size();a++){//找到两个数组中相同的父结点,并
for(int b=0;b<yy.size ();b++){//取最大的父结点。
if(xx[a]==yy[b])xx[a]>t?xx[a]:t;
}
}
return t;
}
...全文
49 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
未注销 2011-11-02
  • 打赏
  • 举报
回复
没怎么认真看。但main函数里两个连续的cin起码要在第一个之后清空吧。cin.clear();

64,439

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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