LA3027 合作网络

 5 #include<iostream>
 6 #include<stdio.h>
 7 #include<string.h>
 8 #include<algorithm>
 9 #include<stdlib.h>
10 #include<math.h>
11 #include<queue>
12 #include<vector>
13 #include<map>
14 #define MAXN 20000+10
15 //#define MAXM 20000+5
16 #define oo 9556531
17 #define eps 0.000001
18 #define PI acos(-1.0)
19 #define REP1(i,n) for(int i=0;i<(n);i++)
20 #define REP2(i,n) for(int i=1;i<=(n);i++)
21 using namespace std;
22 
23 int p[MAXN];
24 int d[MAXN];
25 int n,t;
26 
27 void init()
28 {
29     REP2(i,n)
30     {
31         p[i]=i;
32         d[i]=0;
33     }
34 }
35 
36 int findx(int x)
37 {
38 //    return p[x]==x?0:d[x]+getans(p[x]);
39       if (p[x]!=x) //d[x]任然为0,不需要更新
40       {
41           int px=findx(p[x]);//压缩栈,保证前面的根节点已经更新过
42           d[x]=d[x]+d[p[x]];//保证d[p[x]]已经是p[x]到根节点的距离
43 //          cout<<"px="<<px<<","<<"d[x]="<<d[x]<<endl;
44           return p[x]=px;//在所有的d更新完毕后,把x连接到根节点px上
45       }else return x;
46 }
47 
48 int main()
49 {
50     cin>>t;
51     for(;t;t--)
52     {
53         scanf("%d\n",&n);
54         init();
55         char Q[20];
56         while(cin>>Q)
57         {
58 //            cout<<"Q="<<Q<<endl;
59             if (Q[0]=='O') break;
60             if (Q[0]=='E')//多次询问E,动态更新
61             {
62                 int x;cin>>x;
63                 int px=findx(x);
64                 cout<<d[x]<<endl;
65             }
66             if (Q[0]=='I')
67             {
68                 int i,j;
69                 cin>>i>>j;
70                 d[i]=abs(i-j)%1000;//d[i]:i到父节点的距离,注意取模
71                 p[i]=j;//i的父节点是j
72             }
73         }
74     }
75     return 0;
76 }

 

posted @ 2014-02-26 21:07  little_w  阅读(177)  评论(0编辑  收藏  举报