zoukankan      html  css  js  c++  java
  • poj1703 Find them, Catch them

    并查集。

    这题错了不少次才过的。

    分析见代码。

    http://poj.org/problem?id=1703

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 using namespace std;
     5 const int maxn = 1e5 + 10;
     6 const char str1[] = "Not sure yet.";
     7 const char str2[] = "In different gangs.";
     8 const char str3[] = "In the same gang.";
     9 int fa[maxn], belong[maxn], nex[maxn];
    10 int n, m, u, v, k;
    11 char op;
    12 
    13 int father(int u){
    14     //WHAT WOULD CAUSE AN INFINITE LOOP
    15     if(fa[u] == -1) return u;
    16     int tem = father(fa[u]);
    17     belong[u] = belong[tem];
    18     fa[u] = tem;
    19     return tem;
    20 }
    21 
    22 void solve(){
    23     if(op == 'D'){
    24         if(belong[u] == -1 && belong[v] == -1){
    25             //this is the simplest case
    26             belong[u] = k++;
    27             belong[v] = k++;
    28             nex[u] = v;
    29             nex[v] = u;
    30             return;
    31         }
    32         if(belong[u] != -1 && belong[v] == -1){
    33             //notice that v is never mentioned, but u is already processed
    34             //since is u is vistied, u got its partner
    35             int fu = father(u), fu1 = father(nex[u]);
    36             //draw a line from v to u1
    37             fa[v] = fu1;
    38             nex[v] = fu;
    39             belong[v] = belong[fu1];
    40             return;
    41             //match a virtue partner for node u
    42         }
    43         if(belong[u] == -1 && belong[v] != -1){
    44             int fv = father(v), fv1 = father(nex[v]);
    45             fa[u] = fv1;
    46             nex[u] = fv;
    47             belong[u] = belong[fv1];
    48             return;
    49         }
    50         if(belong[u] != -1 && belong[v] != -1){
    51             //notice that both u and v is already visited
    52             int fu = father(u), fu1 = father(nex[u]);
    53             int fv = father(v), fv1 = father(nex[v]);
    54             int bu = belong[fu] >> 1;
    55             int bv = belong[fv] >> 1;
    56             if(bu > bv){
    57                 // v is relatively primitive
    58                 fa[fu] = fv1;
    59                 fa[fu1] = fv;
    60                 return;
    61             }
    62             if(bu < bv){
    63                 fa[fv] = fu1;
    64                 fa[fv1] = fu;
    65                 return;
    66             }
    67         }
    68     }
    69     if(op == 'A'){
    70         int fu = father(u);
    71         int fv = father(v);
    72         if(belong[fu] == -1 || belong[fv] == -1) puts(str1);
    73         else if(belong[fu] == belong[fv]) puts(str3);
    74         else if(belong[fu] == (1 ^ belong[fv])) puts(str2);
    75         else puts(str1);
    76     }
    77 }
    78 
    79 int main(){
    80     freopen("in.txt", "r", stdin);
    81     int T;
    82     scanf("%d", &T);
    83     while(T--){
    84         scanf("%d%d", &n, &m);
    85         memset(belong, -1, sizeof belong);
    86         memset(fa, -1, sizeof fa);
    87         k = 0;
    88         for(int i = 0; i < m; i++){
    89             scanf(" %c%d%d", &op, &u, &v);
    90             solve();
    91         }
    92     }
    93 }
    View Code
  • 相关阅读:
    包管理器Bower使用手冊之中的一个
    开机就提示“请安装TCP/IP协议,error=10106”的解决的方法
    Apache Thrift的简单使用
    Python机器学习实战&lt;一&gt;:环境的配置
    数据库期末考试复习题 第二�
    数据集成之主数据管理(一)基础概念篇
    Cocos2d-x开发中C++内存管理
    html中#include file的使用方法
    网页的背景图片代码
    TEST
  • 原文地址:https://www.cnblogs.com/astoninfer/p/4836679.html
Copyright © 2011-2022 走看看