zoukankan      html  css  js  c++  java
  • 1213 How Many Tables 简单的并查集问题

    my code:

    #include <cstdio>
    #include <cstring>
    #include<iostream>
    using namespace std;
    int find(int num,int A []){
    while(num!=A[num])//{
    num = A[num];
    return num;
    }//

    bool follow(int a,int b,int A[]){
    int i = find(a,A);
    int j = find(b,A);
    //cout<<"zxd";
    //cout<<i<<" "<<j<<" ";
    if(i == j)return false;
    //cout<<"zxd";
    A[i] = j;
    return true;
    }


    int main()
    {
    int t;
    scanf("%d",&t);
    while(t--){
    //下面的两个变量是人数和关系两个变量
    int m,n;
    scanf("%d%d",&m,&n);
    //在这里还是先创建一个动态数组,来保存返回值
    int *A = new int [m+1];
    for(int i = 1;i <= m;i++)A[i]=i;//for(int i = 1;i <= m;i++)cout<<A[i];

    int a,b,count = 0;
    for(int i = 0; i < n; i++){
    scanf("%d%d",&a,&b);
    // cout<<"循环中ing"<<a<<b<<endl;
    if(follow(a,b,A))count++;
    // cout<<"count++;"<<count<<endl;
    }

    printf("%d ",m - count);
    delete [] A;
    }
    return 0;
    }

    //在这里有两个关键的函数,也就是PPT中的精华部分

    int find(int a)

    //查找根结点

    {

    while(a != fa[a])

    //这里要说明的一点是fa[a]是用来判断自己的上一个节点是什么,最后一个东西就是默认根节点的根节点是自己本身

    a = fa[a];

    return a;

    }

    int find(int a)

    {

    return fa[a] == a?a:fa[a] = find(fa[a]);

    //在找到根节点的同时压缩了路径 ,将保存父节点的数组更改为根节点

    }

    union(u,v)

    {

    fa_u = find(u);

    fa_v = find(v);

    if(fa_u != fa_v)

    fa[fa_u] = fa_v;

    }

    我要坚持一年,一年后的成功才是我想要的。
  • 相关阅读:
    ros 录制
    shell 截取字符串
    Linux 关机
    shell获取字符串长度
    ubuntu14.04 设置开机自启动脚本
    获取本机ip的shell脚本
    shell 杀掉指定进程的服务
    html 绘制矩形轨迹,选中区域
    shell模拟ctrl c停止
    shell 字符串提取数字
  • 原文地址:https://www.cnblogs.com/tianxia2s/p/3865246.html
Copyright © 2011-2022 走看看