POJ 2492 解题报告

来源:互联网 发布:ubuntu查看显卡信息 编辑:程序博客网 时间:2024/05/16 05:43

这道题是union-find的应用。直接是在poj 1732的基础上改的(http://blog.csdn.net/thestoryofsnow/article/details/41939671)。

thestoryofsnow2492Accepted192K829MSC++1870B

/* ID: thestor1 LANG: C++ TASK: poj2492 */#include <iostream>#include <fstream>#include <cmath>#include <cstdio>#include <cstring>#include <limits>#include <string>#include <vector>#include <list>#include <set>#include <map>#include <queue>#include <stack>#include <algorithm>#include <cassert>using namespace std;const int MAXN = 2000;void makeset(vector<int> &parent, vector<int> &rank, const int N){for (int u = 0; u < N; ++u){parent[u] = u;rank[u] = 0;}}int find(int u, vector<int> &parent){if (parent[u] != u){parent[u] = find(parent[u], parent);}return parent[u];}void union_set(int u, int v, vector<int> &parent, vector<int> &rank){int ru = find(u, parent);int rv = find(v, parent);if (ru == rv){return;}if (rank[ru] < rank[rv]){parent[ru] = rv;}else if (rank[rv] < rank[ru]){parent[rv] = ru;}else{parent[ru] = rv;rank[rv]++;}}int main(){vector<int> parent(2 * MAXN);vector<int> rank(2 * MAXN);int T;scanf("%d", &T);for (int t = 0; t < T; ++t){int N, M;scanf("%d%d", &N, &M);makeset(parent, rank, N << 1);bool suspicious = false;for (int i = 0; i < M; ++i){int u, v;scanf("%d%d", &u, &v);u--, v--;// already have a conclusion, no need to processif (suspicious){continue;}if (find(u, parent) == find(v, parent) || find(u + N, parent) == find(v + N, parent)){suspicious = true;}else{union_set(u, v + N, parent, rank);union_set(v, u + N, parent, rank);}}printf("Scenario #%d:\n", t + 1);if (suspicious){printf("Suspicious bugs found!\n\n");}else{printf("No suspicious bugs found!\n\n");}}return 0;  }


0 0
原创粉丝点击