| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1325 人关注过本帖
标题:对于“连通问题的快速查找算法”的疑问
只看楼主 加入收藏
zy_space
Rank: 5Rank: 5
等 级:职业侠客
帖 子:163
专家分:364
注 册:2011-11-14
结帖率:100%
收藏
已结贴  问题点数:40 回复次数:7 
对于“连通问题的快速查找算法”的疑问
这个问题从标准输入读取小于N的非负整数对序列(对p-q表示“把对象B连接到q”),并且输出还未连通的输入对。程序中使用数组id,每个元素表示一个对象,且具有以下性质,当且仅当p和q是连通的,id[p]和id[q]相等为简化起见,定义N为编译时的常数。另一方面,也可以从输入得到它,并动态地为它分配id数组。

    #include <stdio.h>
    #define   N   10000
   
    int main(void)
    {
        int   i, p, q, t, id[N];
        
        for (i = 0; i < N; i++)
           id[i] = i;
        while (scanf("%d %d\n", &p, &q)) {
           if (id[p] == id[q])
               continue;
           for (t = id[p], i = 0; i < N; i++)
               if (id[i] == t)
                 id[i] = id[q];
           printf(" %d %d\n", p, q);
        }
        return 0;
    }

------------------------------------------------------------------------------------------------

我是刚开始学习算法与数据结构的,这个算法程序配合书上的具体实例输入也大致可以弄懂。但是感觉这种使用数组的方式在实际没多少用途,因为数组原本存储数据的空间用来存储数组的下标信息,也导致程序看起来特别费劲。求大虾们给小弟解释一下这种算法和数据结构的使用方式具体有些什么实际用处。如果可能的话最好能用结构体(链表)来代替数组把程序改进一下。
搜索更多相关主题的帖子: 快速 include 动态 元素 
2011-11-19 00:55
zy_space
Rank: 5Rank: 5
等 级:职业侠客
帖 子:163
专家分:364
注 册:2011-11-14
收藏
得分:0 
我的问题没有表述清楚吧,就是想知道这种算法在实际问题中的具体用处,可以解决一些什么样的问题。自己琢磨了一下写了一个改进版本的的:

#include <stdio.h>

#define N 10

int main(void)
{
    int   i, p, q, t;
    struct link {
           struct link   *n;           //结构体中的指针
           int           d;            //标记变量,存储连接信息
           int           data;         //存储需要的值
    }   id[N];
   
    for (i = 0; i < N; i++)
       id[i].d = i;
    while (scanf("%d %d\n", &p, &q) == 2) {
       if (id[p].d == id[q].d) continue;
       for (t = id[p].d, i = 0; i < N; i++)
          if (id[i].d == t) {               //进行连接
             id[i].d = id[q].d;             //更改标记变量的值
             id[i].n = &id[q];              //用指针进行实际连接
          }
       printf(" %d %d\n", p, q);
       for (i = 0; i < N; i++)
          printf("     %d", id[i].d);
       printf("\n");
    }
    return 0;
}

依次输入以下元素:
3    4
4    9
8    0
2    3
5    6
2    9
5    9
7    3
4    8
5    6
0    2
6    1

可以得到如下结果:

3 4
4 9
 3 4
     0     1     2     4     4     5     6     7     8     9
8 0
 4 9
     0     1     2     9     9     5     6     7     8     9
2 3
 8 0
     0     1     2     9     9     5     6     7     0     9
5 6
 2 3
     0     1     9     9     9     5     6     7     0     9
2 9
 5 6
     0     1     9     9     9     6     6     7     0     9
5 9
7 3
 5 9
     0     1     9     9     9     9     9     7     0     9
4 8
 7 3
     0     1     9     9     9     9     9     9     0     9
5 6
 4 8
     0     1     0     0     0     0     0     0     0     0
0 2
6 1

6 1
 6 1
     1     1     1     1     1     1     1     1     1     1                              //表示所有结构体已经连接到了一起

何必等待?梦在今朝
2011-11-19 22:32
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:2 
关于这个问题目前最快的算法是“并查集”,LZ如果有兴趣可以看看
2011-11-19 22:59
zy_space
Rank: 5Rank: 5
等 级:职业侠客
帖 子:163
专家分:364
注 册:2011-11-14
收藏
得分:0 
回复 3楼 czz5242199
表示这是第一章第一节的内容,后面算法还有好多。不过看起来头都晕晕的,因为不知道具体的实际用处是什么

何必等待?梦在今朝
2011-11-19 23:03
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 
楼主看的书叫什么名字?

—>〉Sun〈<—
2011-11-20 00:20
zy_space
Rank: 5Rank: 5
等 级:职业侠客
帖 子:163
专家分:364
注 册:2011-11-14
收藏
得分:0 
回复 5楼 cosdos
算法:C语言实现,国外的翻译教材Algorithms in C

何必等待?梦在今朝
2011-11-20 00:44
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:38 
例如输入3 4,由于先前没有任何连通对,所以打印3 4,再输入 4 9 ,先前给出的连通对是3 4,在此基础上得不到4 9连通(即把4 9识为提供了一个新的连通),所以同样打印4 9,当再输入3 9的时候,由于前面已经给出了3 4及4 9,由可传递性可以得到3 9连通,即3 9不再是一个新的连通,故不打印。


程序用于判断是否连通。

—>〉Sun〈<—
2011-11-20 02:01
zy_space
Rank: 5Rank: 5
等 级:职业侠客
帖 子:163
专家分:364
注 册:2011-11-14
收藏
得分:0 
回复 7楼 cosdos
非常感谢,这个问题大致懂了。然后书上说连通问题用于求解迷宫中两个点是否连通的问题,如下图:
图片附件: 游客没有浏览图片的权限,请 登录注册

判断A和B是否是连通的。那么得将迷宫分块并且数据化,用二维数组来表示,并且用连通算法来求解是吗?

何必等待?梦在今朝
2011-11-20 21:38
快速回复:对于“连通问题的快速查找算法”的疑问
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018629 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved