X

来源:互联网 发布:java web项目实例 pdf 编辑:程序博客网 时间:2024/05/01 16:00

典型的种类并查集。

#include<iostream>#include<string.h>#include<string>#include<stack>#include<stdio.h>#include<queue>#include<functional>#include<set>#include<map>#include<stdlib.h>#include<vector>#include<math.h>#include <algorithm>#pragma warning(disable:4996)using namespace std;const int maxs = 1000000;int pa[maxs];int ranks[maxs];/*void build(int l, int r, int root)       线段树模板{if (l == r){scanf("%d", sum[root]); return;}else{int mid = (l + r) >> 2;build(l, mid, root << 1);build(mid + 1, r, root << 1);sum[root] = sum[root << 1] > sum[(root << 1) + 1] ? sum[root << 1]: sum[(root << 1) + 1];}}int qmax(int ql, int qr, int l, int r, int root){if (ql <= l&&qr >= r)return sum[root];else{int mid = (l + r) >> 1;if (qr <= mid)return qmax(ql, qr, l, mid, root << 1);else if (ql > mid){return qmax(ql, qr, mid + 1, r, (root << 1));}else{return max(qmax(ql, qr, l, mid, root << 1), qmax(ql, qr, mid + 1, r, (root << 1) + 1));}}}void update(int p, int q, int l, int r, int root){if (l == p&&r == p){sum[root] = q;return;}int mid = (l + r) >> 1;if (p <= mid)update(p, q, l, mid, root << 1);elseupdate(p, q, mid + 1, r, (root << 1) + 1);sum[root] = sum[root << 1] > sum[(root << 1) + 1] ? sum[root << 1] : sum[(root << 1) + 1];}void pushup(int root){sum[root] = sum[root << 1] + sum[root<<1 | 1];}void pushdown(int root, int m){if (col[root]){col[root << 1] = col[root << 1 | 1] = col[root];sum[root << 1] = (m - (m >> 1))*col[root];sum[root << 1 | 1] = (m >> 1)*col[root];col[root] = 0;}}*//*int lowbit(int x){        return x&(-x);}int qus(int x)              树状数组模板{int num = 0;while (x){num += sum[x];x -= lowbit(x);}return num;}void add(int x, int v,int n){while (x <= n){sum[x] += v;;x += lowbit(x);}}void upd(int x, int y, int v,int n){add(x, v,n);add(y + 1, -v,n);}*/int n, m, q, flag,name,id,use,t;void make_set(){for (int i = 0; i <= n+m; i++){pa[i] = i;ranks[i] = 0;}}int find_set(int x){if (x != pa[x])return pa[x] = find_set(pa[x]);return x;}void union_set(int a, int b,int v){int x = find_set(a);int y = find_set(b);if (v)ranks[x] = v;pa[x] = y;if (!ranks[y])ranks[y] = ranks[x];}int main(){while(~scanf("%d %d %d", &n,&m,&q)){make_set();for (int i = 0; i < n; i++){scanf("%d %d", &name, &id);if (id)ranks[name] = id;}for (int i = 0; i < m; i++){scanf("%d %d %d", &use, &name, &id);if (id)ranks[n + use] = id;union_set(use+n, name, id);}while (q--){cin >> flag >> t;if (!flag)cout << ranks[find_set(t)] << endl;elsecout << ranks[find_set(t + n)] << endl;}}return 0;}


原创粉丝点击