并查集

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApplication3
{
    class Program
    {
        private static int[] gx;
        private static int userNum = 100000;
        public static void Main()
        {
            gx = new int[userNum + 1];

            //生成初始数组 gx[i] = i;
            for (int i = 0; i <= userNum; i++)
            {
                gx[i] = i;
            }

            //连通
            StreamReader sr = new StreamReader(@"144341511030664.txt", Encoding.Default);
            String strLine = null;
            String[] arrStr = null;
            while ((strLine = sr.ReadLine()) != null)
            {
                arrStr = strLine.Split(' ');
                int xr = FindRoot(int.Parse(arrStr[0]));
                int yr = FindRoot(int.Parse(arrStr[1]));
                //如果不是同一个根节点则合并
                if (xr != yr)
                {
                    gx[yr] = xr;
                }
            }

            //计数 gx[i]=i 则是根节点
            for (int i = 1; i <= userNum; i++)
            {
                if (gx[i] == i)
                {
                    gx[0]++;
                }
            }
            Console.WriteLine(gx[0]);
            Console.Read();
        }


        private static int FindRoot(int x)
        {
            int r = x, j;
            while (gx[r] != r)//如果不是根节点 则继续上推
            {
                r = gx[r];
            }
            //此时r为根节点
            while (gx[x] != r)//压缩路径 所有非根节点直接指向根节点
            {
                j = gx[x];
                gx[x] = r;
                x = j;
            }
            return r;
        }
    }
}
原文地址:https://www.cnblogs.com/tqlin/p/5320362.html