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;
}
}
}