您的位置:首页 > 理论基础 > 计算机网络

LA3027 合作网络

2014-02-26 21:07 253 查看
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
#include<math.h>
#include<queue>
#include<vector>
#include<map>
#define MAXN 20000+10
//#define MAXM 20000+5
#define oo 9556531
#define eps 0.000001
#define PI acos(-1.0)
#define REP1(i,n) for(int i=0;i<(n);i++)
#define REP2(i,n) for(int i=1;i<=(n);i++)
using namespace std;

int p[MAXN];
int d[MAXN];
int n,t;

void init()
{
REP2(i,n)
{
p[i]=i;
d[i]=0;
}
}

int findx(int x)
{
//    return p[x]==x?0:d[x]+getans(p[x]);
if (p[x]!=x) //d[x]任然为0,不需要更新
{
int px=findx(p[x]);//压缩栈,保证前面的根节点已经更新过
d[x]=d[x]+d[p[x]];//保证d[p[x]]已经是p[x]到根节点的距离
//          cout<<"px="<<px<<","<<"d[x]="<<d[x]<<endl;
return p[x]=px;//在所有的d更新完毕后,把x连接到根节点px上
}else return x;
}

int main()
{
cin>>t;
for(;t;t--)
{
scanf("%d\n",&n);
init();
char Q[20];
while(cin>>Q)
{
//            cout<<"Q="<<Q<<endl;
if (Q[0]=='O') break;
if (Q[0]=='E')//多次询问E,动态更新
{
int x;cin>>x;
int px=findx(x);
cout<<d[x]<<endl;
}
if (Q[0]=='I')
{
int i,j;
cin>>i>>j;
d[i]=abs(i-j)%1000;//d[i]:i到父节点的距离,注意取模
p[i]=j;//i的父节点是j
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: