Connections in Galaxy War(反向并查集)
来源:互联网 发布:手机adb软件 编辑:程序博客网 时间:2024/06/05 09:39
题目链接上一种法:http://blog.csdn.net/qq_37753409/article/details/77922448.
提交后发现Runtime error. 查阅资料后,发现要是用反向并查集,在这里用反向并查集实现.
题目链接:https://vjudge.net/problem/ZOJ-3261
代码如下:
#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>#include <set>using namespace std;const int STAR_SIZE = 10010;const int INQUIRY_SIZE = 50010;struct Star{ int ID; int POWER; void setData(int id, int power){ ID = id; POWER = power; }};struct Inquiry{ int a, b; int flag; int ans; void setData(int f, int aa, int bb){ a = aa; b = bb; flag = f; }};Star star[STAR_SIZE];Inquiry inquiry[INQUIRY_SIZE];int MAX[STAR_SIZE];set< pair<int, int> > T;void init(){ T.clear(); for(int i = 0; i < STAR_SIZE; ++i){ star[i].setData(i, -1); } for(int i = 0; i < INQUIRY_SIZE; ++i){ inquiry[i].setData(-1, 0, 0); inquiry[i].ans = -1; } memset(MAX, -1, sizeof(MAX));} int find(int p){ if(star[p].ID != p){ int d = star[p].ID; star[p].ID = find(star[p].ID); MAX[p] = max(MAX[p], MAX[d]); } return star[p].ID;}void Union(int a, int b){ int x = find(a); int y = find(b); if(x == y) return; if(MAX[x] < MAX[y] || (MAX[x] == MAX[y] && x > y)){ star[x].ID = y; }else{ star[y].ID = x; } }int main(){ int n, m, q; int k = 0; while(~scanf("%d", &n)){ if(k++)puts(""); init(); char op[10]; int a, b; for(int i = 0; i < n; ++i){ scanf("%d", &star[i].POWER); } scanf("%d", &m); for(int i = 0; i < m; ++i){ scanf("%d%d", &a, &b); if(a > b) swap(a, b); T.insert(make_pair(a, b)); } scanf("%d", &q); for(int i = 0; i < q; ++i){ scanf("%s", op); if(op[0] == 'q'){ scanf("%d", &a); inquiry[i].setData(0, a, 0); }else if(op[0] == 'd'){ scanf("%d%d", &a, &b); if(a > b) swap(a, b); T.erase(make_pair(a, b)); inquiry[i].setData(1, a, b); } } for(int i = 0; i < n; ++i){ MAX[i] = star[i].POWER; } for(set< pair<int, int> >::iterator it = T.begin(); it != T.end(); it++){ a = (*it).first; b = (*it).second; Union(a, b); } for(int i = q - 1; i >= 0; i--){ if(inquiry[i].flag == 0){ if(MAX[find(inquiry[i].a)] > star[inquiry[i].a].POWER){ inquiry[i].ans = star[inquiry[i].a].ID; }else{ inquiry[i].ans = -1; } }else if(inquiry[i].flag == 1){ Union(inquiry[i].a, inquiry[i].b); } } for(int i = 0;i < q; i++) { if(inquiry[i].flag == 0) { printf("%d\n",inquiry[i].ans); } } } return 0;}
阅读全文
0 0
- Connections in Galaxy War(反向并查集)
- ZOJ 3261Connections in Galaxy War 反向用并查集
- zoj 3261 Connections in Galaxy War(逆向并查集)
- ZOJ 3261 Connections in Galaxy War(并查集)
- ZOJ 3261 Connections in Galaxy War【并查集】
- zoj3261 Connections in Galaxy War (离线并查集)
- ZOJ 3261 Connections in Galaxy War (并查集)
- zoj 3261 - Connections in Galaxy War(并查集)
- ZOJ 3261 Connections in Galaxy War 并查集
- Zoj 3563 Connections in Galaxy War 逆向并查集
- zoj Connections in Galaxy War(逆向并查集)
- Connections in Galaxy War (逆向并查集)
- Zoj 3261 Connections in Galaxy War【逆序并查集】
- Connections in Galaxy War并查集+set+脑洞
- ZOJ-3261-Connections in Galaxy War [逆向并查集]
- [并查集+路径压缩]zoj 3261:Connections in Galaxy War
- ZOJ Problem Set - 3261 Connections in Galaxy War(并查集)
- Zoj 3261 Connections in Galaxy War (逆向并查集)
- 棋盘覆盖
- 朴素贝叶斯(NaiveBayes)针对小数据集中文文本分类预测
- 【深度学习】迁移学习
- 百度在用的Python MySQL连接池
- Redis基本数据类型
- Connections in Galaxy War(反向并查集)
- ios nil、NULL和NSNull 的使用
- 面向对象和面向过程的区别
- php laravel 源码阅读2(入口文件)
- 第2周项目3 ——汉诺塔程序
- 第八章 多态
- ssh连接共享
- 给新的虚拟系统磁盘分区(从虚拟机创建到项目运行二)
- 向数组中插入元素排序