zoukankan      html  css  js  c++  java
  • HDU

    /*
      思路来自blog:
      http://blog.csdn.net/qq_34374664/article/details/53492176
      
      虽然并查集之前写过,但还是不熟,理解也不是太深刻,并查集中的压缩,更是没听过也不会写...好在有上面那个blog,讲解得十分细致
      
      而且这个博主不止这一篇博文这样,我找了几篇他的知识点讲解,都是走的细致易懂风,很适合初学者...嗯,可以刷书刷到瓶颈期的时候,用他的博客接着学,真的很推荐他的blog
      
      突然看到hdoj上有这么一句
      Huge input, scanf is recommended.
      那大家如果被卡TLE,就换成scanf吧!~
    */



    #include <iostream>
    #include <cstring>
    using namespace std;
    const int maxn = 1005;
    int N, M;
    int f[maxn]; // 用来记录对应的树根
    int num[maxn]; // num[i] 用来记录根节点为i的数据有几个,不过它最关键的作用是,统计有多少个相异的根节点
    
    int findx(int x)
    {
    	int t = x;
    	while (t != f[t])
    	t = f[t]; // 找到x的根
    	
    	//压缩
    	int i = x, j;
    	while (f[i] != t)
    	{
    		j = f[i];
    		f[i] = t;
    		i = j;
    	}
    	return t;
    } 
    
    void unite(int x, int y)
    {
    	x = findx(x);
    	y = findx(y);
    	
    	if (x != y)
    	{
    		f[y] = x;
    	}
    }
    
    int main()
    {
    	int i, a, b, ans;
    	while (cin >> N >> M && N)
    	{
    		for (i = 1; i <= N; i++)
    		f[i] = i;
    		
    		for (i = 1; i <= M; i++)
    		{
    			cin >> a >> b;
    			unite(a, b);
    		}
    		
    		memset(num, 0, sizeof(num));
    		for (i = 1; i <= N; i++)
    		num[findx(i)]++; //注意这里,一开始自己写的时候,错写成了 num[f[x]]++; 后来想明白了不能这样,因为是要找有多少个不同的根,所以在枚举城市的时候,是要找到他们的根,然后将数组对应位置++,果断该用findx()函数 
    		
    		for (ans = 0, i = 1; i <= N; i++)
    		if (num[i])
    		ans++;
    		
    		cout << --ans << endl;
    	}
    	return 0;
    }


  • 相关阅读:
    [Android]XML那些事儿-manifest属性2
    [Android]数据存储-SharedPreferences1
    [Android]2013.5.4日志
    [Android]获得Andriod手机屏幕分辨率的两种方法
    [Android]Java-break(label)/return/continue语句详解
    [WordPress]欢迎使用 WordPress for SAE
    [Webkit]最简单易用的webkit学习环境-ISee
    [Webkit]了解WebKit与Qt WebKit对比区别
    [PhoneGap]开发环境搭建与简单应用
    LeetCode-62.Unique Paths
  • 原文地址:https://www.cnblogs.com/mofushaohua/p/7789491.html
Copyright © 2011-2022 走看看