题目描述:
给n个栈,存取的数据为123···n;现在执行两种操作:(M X Y)为将包含X的栈压入包含Y的栈里;(CX)为输出包含X的栈里,X下面数的个数。
using namespace std;
struct node
{
int parent;
int
sum;
int up;
};
int n,m;
int i,j;
int u,v;
char act;
cin>>n;
for(i=1;i
{
st[i].parent=i;
st[i].sum=1;
st[i].up=0;
}
while(n--)
{
cin>>act;
if(act=='M')
{
cin>>u>>v;
Union(u,v);
}
else if(act=='C')
{
cin>>u;
m=find(u);
cout<<st[m].sum-st[u].up-1<<endl;
}
}
return 0;
u=find(u);
v=find(v);
st[v].parent=u;
st[v].up=st[u].sum;
st[u].sum+=st[v].sum;
int p;
if(st[x].parent!=x)
{
p=st[x].parent;
//保存原有的根节点,以便新增根节点时,旧的被覆盖
st[x].parent=find(st[x].parent);
//路径压缩使得节点中parent都为根节点。
st[x].up+=st[p].up;
//本节点的up加上旧根节点的up,为新增根节点后的up
}
returnst[x].parent;
题目分析:参考
http://blog.sina.com.cn/s/blog_626049050100k57s.html;虽然是并查集,但是还是不是很清楚的思路,关键还是要清楚根节点更新,那么相应的子节点也要相应的更新(路径压缩)。
题目代码:
#include
#define MAX 40000
node st[MAX];
void Union(int u,int v);
int find(int x);
int main ()
{
}
void Union(int u,int v)
//将包含u的栈,压入包含v的栈
操作的是根节点
{
}
int find(int x)
//返回包含x所在的根节点
{
}