| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2372 人关注过本帖
标题:六度空间,错在哪了?
只看楼主 加入收藏
令狐少侠56
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:320
专家分:175
注 册:2014-4-10
结帖率:58.18%
收藏
已结贴  问题点数:40 回复次数:3 
六度空间,错在哪了?
图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册

六度空间,用邻接矩阵做的,看了两个小时还没找到错在哪,按照视频上的方法做的,代码找不到错误位置啊。
程序代码:
#include <stdio.h>
#include <stdlib.h>

#define MaxSizeQ 10000
#define MaxVertex 10000

int Visited[MaxVertex] ;
typedef int VertexType ;
typedef int EdgeType   ;

typedef struct
{
    int rear ;
    int front ;
    int queue[MaxSizeQ] ;
}Queue ;


typedef struct
{
    VertexType vertex[MaxVertex] ;//顶点数组
    EdgeType edge[MaxVertex][MaxVertex] ;//边数组edge[v1][v2]v1,v2为顶点坐标而非顶点名称
    int n ;//顶点个数
    int e ;//边个数

}MGraph ;


void  InitializeQ( Queue* Q  ) //初始化队列
{
    Q->front=0 ;
    Q->rear=-1 ;
}

int IsFullQ( Queue* Q  )  //判断队列是否满
{
    if(Q->rear==MaxSizeQ) return 1;
    else return 0 ;
}


int IsEmptyQ( Queue* Q  )    //判断队列是否空
{
    //    printf("判断队列是否空\n");    
    if(Q->rear < Q->front )
        return 1 ;
    else return 0 ;                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
}


void AddQ( Queue* Q ,int CurV )    //顶点编号入队
{
    
    if( !(IsFullQ(Q)) )
    { 
        Q->rear++ ;
        Q->queue[Q->rear ] = CurV ;        
    }
}


int  DeleteQ( Queue* Q ) //顶点坐标出队
{
    int i ;
    i = Q->front ;
    if( !( IsEmptyQ(Q) ) )
    {
        Q->front++ ;
        return Q->queue[i] ;//返回顶点坐标
    }
}


void CreateMGraph( MGraph* G )
{
    int i,j ;
    int v1,v2 ;

    scanf("%d",&G->n) ;//输入顶点个数
    scanf("%d",&G->e) ;//输入边个数
    

    for(i=0 ; i<G->n ; i++ )//顶点从1到N编号(命名)
        G->vertex[i] = i+1 ;
    for(i=0 ; i<G->n; i++ )//边初始化
        for(j=0 ; j<G->n ; j++ )
            G->edge[i][j] = 0 ;
    for(i=0 ; i<G->e ; i++)
    {
        scanf("%d %d",&v1,&v2);//输入顶点名称,比坐标大1(1到N)
        G->edge[v1-1][v2-1] = G->edge[v2-1][v1-1] = 1 ;
    }
}


int  BFS( MGraph* G, int CurV, Queue* Q )
{
    //CurV当前搜索结点坐标
    int i,V ;
    int VisitedCount ;
    int Level ;
    int  LastV , TailV ;//CurV当前搜索结点,当前结点所在层最后一个结点,下一层最后结点各自坐标

    AddQ( Q,CurV ) ;//当前结点坐标压入队中

    printf("入 队 节 点 坐 标  %d \n",CurV);

    Visited[CurV] = 1 ;
    VisitedCount = 1  ;

    Level = 0 ;
    
    while( !(IsEmptyQ(Q)) ) 
    {
        printf("出 队 结 点 坐 标  %d \n" , DeleteQ( Q )) ;
        V = DeleteQ( Q ) ;
    
        for(i=0 ; i<G->n ; i++ )        
        {
            printf("V=%d ,i=%d , G->edge[V][i]=%d \n",V,i,G->edge[V][i] ) ;
            if(Visited[i] == 0 && G->edge[V][i]==1 )//如果i号顶点未被访问 且 当前顶点可到达到i顶点
            {
                printf("Visited[%d]= %d \n",i,Visited[i] ) ;
                printf("入 队 节 点 坐 标 %d \n",i);
                AddQ( Q,i ) ;//当前结点坐标压入队中
                Visited[i] = 1 ;
                VisitedCount ++ ;
                TailV = i ;
            }
        }

        if( LastV == V )
        { Level++ ; LastV = TailV ; }

        if( Level == 6 )   break ;
        //    return VisitedCount ;
    }
    return VisitedCount ;
}




int main(   )
{
    int i,j ;
    int VisitedCount ;
    int CurV ;

    MGraph* G ;
    Queue*  Q ;

    Q = (Queue*)malloc( sizeof(Queue) ) ;
    G = (MGraph*)malloc( sizeof(MGraph) ) ;//图中顶点从1开始编号

    InitializeQ( Q ) ;
    CreateMGraph( G ) ;

    for(i=0 ; i<G->n; i++ )//输出矩阵
    {
        {    for(j=0 ; j<G->n ; j++ )
        printf( "%d "  , G->edge[i][j] ) ;     }
        printf("\n") ;
    }


//    for( CurV=0 ; CurV< G->n ; CurV++  )
//    {    
        for( i=0 ; i<G->n ; i++)//标记数组初始化
            Visited[i]=0 ;

        VisitedCount = BFS(  G, 0 ,  Q ) ;

        printf("count=%d\n",VisitedCount);
//    }
    
}


图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: 空间 
2015-11-30 15:00
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:40 
BFS函数中LastV未初始化,虽然我的编译器会默认初始化为 0

DeleteQ调用一次就够了

V = DeleteQ(Q);
printf("出 队 结 点 坐 标  %d \n", V);


[此贴子已经被作者于2015-11-30 18:43编辑过]



[fly]存在即是合理[/fly]
2015-11-30 18:40
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
程序代码:
int BFS(MGraph* G, int CurV, Queue* Q)
{
    //CurV当前搜索结点坐标
    int i, V;
    int VisitedCount;

    AddQ(Q, CurV); //当前结点坐标压入队中

    printf("入 队 节 点 坐 标  %d \n", CurV);

    Visited[CurV] = 1;
    VisitedCount = 1;

    while (!(IsEmptyQ(Q)))
    {
        if (Visited[V = DeleteQ(Q)] > 6) break;

        printf("出 队 结 点 坐 标  %d \n", V);

        for (i = 0;i < G->n;i++)
        {
            if (Visited[i] == 0 && G->edge[V][i] == 1) //如果i号顶点未被访问 且 当前顶点可到达到i顶点
            {
                AddQ(Q, i); //当前结点坐标压入队中
                Visited[i] = Visited[V] + 1;
                VisitedCount++;
            }
        }
    }
    return VisitedCount;
}


[fly]存在即是合理[/fly]
2015-11-30 18:48
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
收藏
得分:0 
整合了一下,还有一个队列未清空问题,自己解决吧


[fly]存在即是合理[/fly]
2015-11-30 18:55
快速回复:六度空间,错在哪了?
数据加载中...
 
   



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

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