http://acm.hdu.edu.cn/showproblem.php?pid=3635
题目意思是说n个球在n个城市。
每次操作把编号i的球所在的城市的所有的求全部一道另一城市B
每次询问访问编号i的球的城市,以及这个城市的球的数量,以及这个球被移动了多少次。
方法就是用一个结构体记录每个球的父节点和移动次数以及这个节点的球的个数(球和城市可以堪为一个整体),然后每次操作就行。
1 #include <map> 2 #include <set> 3 #include <stack> 4 #include <queue> 5 #include <cmath> 6 #include <ctime> 7 #include <vector> 8 #include <cstdio> 9 #include <cctype> 10 #include <cstring> 11 #include <cstdlib> 12 #include <iostream> 13 #include <algorithm> 14 using namespace std; 15 #define INF 0x3f3f3f3f 16 #define MAX(a,b) (a > b ? a : b) 17 #define MIN(a,b) (a < b ? a : b) 18 #define mem0(a) memset(a,0,sizeof(a)) 19 #define lson k<<1, L, mid 20 #define rson k<<1|1, mid+1, R 21 22 typedef long long LL; 23 const double eps = 1e-12; 24 const int MAXN = 100005; 25 const int MAXM = 500005; 26 27 struct NODE 28 { 29 int num; 30 int fa; 31 int time; 32 }p[MAXN]; 33 int N, Q; 34 35 void init()//初始化 36 { 37 for(int i=0;i<=N;i++) { 38 p[i].fa = i; 39 p[i].num = 1; 40 p[i].time = 0; 41 } 42 } 43 44 int find(int x)//找父节点 45 { 46 if(x == p[x].fa) return x; 47 int fa = p[x].fa;//记录这个节点的父节点 48 p[x].fa= find(p[x].fa); 49 p[x].time += p[fa].time;//这个节点移动的次数加上他父节点次数 50 return p[x].fa; 51 } 52 53 void Union(int x, int y)//合并 54 { 55 int a = find(x); 56 int b = find(y); 57 if(a != b) 58 { 59 p[a].fa = p[b].fa;//连边 60 p[b].num += p[a].num;//龙珠的数量 61 p[a]. time ++;//a又多移动了一次 62 } 63 } 64 65 int main() 66 { 67 //freopen("in.txt", "r", stdin); 68 int T=0, Cas; 69 scanf("%d", &Cas); 70 while(Cas--) 71 { 72 scanf("%d%d%*c", &N, &Q); 73 init(); 74 char ch; int a, b; 75 printf("Case %d: ", ++T); 76 for(int i=0;i<Q;i++) 77 { 78 scanf("%c", &ch); 79 if(ch == 'T') { 80 scanf("%d %d%*c", &a, &b); 81 Union(a, b); 82 } 83 else { 84 scanf("%d%*c", &a); 85 b = find(a);//必须先找一遍他被移动了多少次 86 printf("%d %d %d ", b, p[b].num, p[a].time); 87 } 88 } 89 } 90 return 0; 91 }
但是我把树的层数减少那步去掉后字节搜索层数居然和这个没什么区别,只能说数据太弱了= =
1 #include <map> 2 #include <set> 3 #include <stack> 4 #include <queue> 5 #include <cmath> 6 #include <ctime> 7 #include <vector> 8 #include <cstdio> 9 #include <cctype> 10 #include <cstring> 11 #include <cstdlib> 12 #include <iostream> 13 #include <algorithm> 14 using namespace std; 15 #define INF 0x3f3f3f3f 16 #define MAX(a,b) (a > b ? a : b) 17 #define MIN(a,b) (a < b ? a : b) 18 #define mem0(a) memset(a,0,sizeof(a)) 19 #define lson k<<1, L, mid 20 #define rson k<<1|1, mid+1, R 21 22 typedef long long LL; 23 const double eps = 1e-12; 24 const int MAXN = 100005; 25 const int MAXM = 500005; 26 27 struct NODE 28 { 29 int num; 30 int fa; 31 }p[MAXN]; 32 int N, Q; 33 34 void init() 35 { 36 for(int i=0;i<=N;i++) { 37 p[i].fa = i; 38 p[i].num = 1; 39 } 40 } 41 42 int find(int x) 43 { 44 if(x == p[x].fa) return x; 45 return find(p[x].fa); 46 } 47 48 void Union(int x, int y) 49 { 50 int a = find(x); 51 int b = find(y); 52 if(a != b) 53 { 54 p[a].fa = b; 55 p[b].num += p[a].num; 56 } 57 } 58 59 int main() 60 { 61 int T=0, Cas; 62 scanf("%d", &Cas); 63 while(Cas--) 64 { 65 scanf("%d%d%*c", &N, &Q); 66 init(); 67 char ch; int a, b; 68 printf("Case %d: ", ++T); 69 for(int i=0;i<Q;i++) 70 { 71 scanf("%c", &ch); 72 if(ch == 'T') { 73 scanf("%d %d%*c", &a, &b); 74 Union(a, b); 75 } 76 else { 77 int time = 0; 78 scanf("%d%*c", &a); 79 while(a != p[a].fa){ time ++; a = p[a].fa; } 80 printf("%d %d %d ", a, p[a].num, time); 81 } 82 } 83 } 84 return 0; 85 }