`
jaychang
  • 浏览: 728211 次
  • 性别: Icon_minigender_1
  • 来自: 嘉兴
社区版块
存档分类
最新评论

无向图连通分量的计算

 
阅读更多
#include<iostream>
#define MAX_VERTEX_NUM 50

using namespace std;

typedef char VerType;

typedef struct ArcNode                 //定义弧结点所在位置,
{
  int adj;
  int info;
  ArcNode *next;
}ArcNode;

typedef struct VerNode          //定义顶点(顶点数据,顶点所指向第一条弧的指针)
{
  VerType data;
  ArcNode *first;
}VerNode;

typedef struct AdjList      //图的定义
{
  VerNode VerNodes[MAX_VERTEX_NUM]; //顶点集
  int verNum,arcNum;        //顶点数,弧数
}AdjList;

typedef struct Queue      //FIFO队列
{
  int Item[MAX_VERTEX_NUM];
  int front,rear;
}Queue;

int visited[MAX_VERTEX_NUM];    //顶点访问标志数组

//定位某一结点的位置,找不到返回0
int LocateGraph(const AdjList *g,const char data)
{
  for(int i=1;i<=g->verNum;i++)
  {
     if(g->VerNodes[i].data==data)
         return i;
  }
  return 0;
}

//初始化队列
void InitQueue(Queue *Q)
{
  for(int i=1;i<=MAX_VERTEX_NUM;i++)
  {
     Q->Item[i]=0;
  }
  Q->front=Q->rear=1;
}


//创建图的邻接表
void CreateAdjList(AdjList *g)
{
  int s,d,weigth;
  char sChar,dChar;
  ArcNode *q=NULL;
  cout<<"输入图的顶点数,弧数\n";
  cin>>g->verNum>>g->arcNum;
  cout<<"输入每个顶点的信息\n";
  //初始化顶点
  for(int i=1;i<=g->verNum;i++)
  {
     cin>>g->VerNodes[i].data;
     g->VerNodes[i].first=NULL;
  }
  //初始化弧
  for(i=1;i<=g->arcNum;i++)
  {
     cout<<"输入第"<<i<<"条弧的起始,目的,弧的权值"<<endl;
     cin>>sChar>>dChar>>weigth;
     s=LocateGraph(g,sChar);
     d=LocateGraph(g,dChar);       //定位该顶点的位置
     q=(ArcNode *)malloc(sizeof(ArcNode));
     q->adj=d;q->info=weigth;
     q->next=g->VerNodes[s].first;
     g->VerNodes[s].first=q;
  }
}

//初始化访问标志数组,0为未访问过相应的顶点i
void InitVisited(AdjList *g)
{
  for(int i=1;i<=g->verNum;i++)
  {
     visited[i]=0;
  }
}

//访问顶点值
void visit(AdjList *g,int v)
{
  cout<<g->VerNodes[v].data<<endl;
}

//广度遍历图从v顶点开始
void BFS(AdjList *g,int v)
{
  ArcNode *q=NULL;
  Queue *Q=(Queue *)malloc(sizeof(Queue));
  InitQueue(Q);       
  Q->Item[Q->rear]=v;visit(g,v);visited[v]=1;
  Q->rear=(Q->rear+1)%MAX_VERTEX_NUM;
  while(Q->front!=Q->rear)                   //队列不为空
  {
     v=Q->Item[Q->front];                   //取队首元素
     Q->front=(Q->front+1)%MAX_VERTEX_NUM;
     q=g->VerNodes[v].first;
     while(q!=NULL)                         //同一层上(广度搜索的层)还有其他元素,则访问顶点,入队
     {
       if(!visited[q->adj])
      {
         visit(g,q->adj);
         visited[q->adj]=1;
         Q->Item[Q->rear]=q->adj;
         Q->rear=(Q->rear+1)%MAX_VERTEX_NUM;
         q=q->next;
      }
   }
}

}

//广度遍历图
int BFSTransfer(AdjList *g)
{
  int count=0;
  InitVisited(g);
  for(int i=1;i<=g->verNum;i++)
  {
     if(!visited[i])
     {
        BFS(g,i);
        count++;
     }
  }
  return count;
}

int main()
{
  int count;
  AdjList *g=(AdjList*)malloc(sizeof(AdjList));
  CreateAdjList(g);
  if((count=BFSTransfer(g))!=1)
     cout<<"为非连通图,连通分量为"<<count<<endl;
  else
    cout<<"为连通通"<<endl;
   return 0;
}
分享到:
评论
2 楼 jaychang 2010-07-29  
guooscar 写道
这位大哥很happy么~发的一个接一个的

呵呵,以前是放在另一个博客里的,全部粘贴过来了
1 楼 guooscar 2010-07-29  
这位大哥很happy么~发的一个接一个的

相关推荐

    数据结构的无向图的连通分量

    ### 数据结构中的无向图与连通分量 #### 一、无向图与连通性的定义 在数据结构中,无向图是一种常见的图结构,其中边没有方向性,即边是双向的。无向图可以用来表示很多实际问题中的关系网络,如社交网络、计算机...

    无向图连通分支的C运算

    无向图连通分支在计算机科学中是一个重要的概念,特别是在图论和算法设计领域。它涉及到如何识别并分割一个无向图中的各个连通部分,这些部分是图中任意两个节点都存在路径相连的子图。在给定的标题“无向图连通分支...

    图的遍历——计算连通分量个数

    要求采用邻接矩阵作为无向图的存储结构,邻接表作为有向图的存储结构,完成无向图和有向图的建立,并对建立好的图进行深度和广度优先遍历。具体实现要求: 1. 通过键盘输入图的顶点和边信息,分别构造一个无向图的...

    实验_C++_数据结构_图连通分量_

    本实验的主题是“C++数据结构_图连通分量”,这涉及到图论和算法设计。在这个实验中,我们将关注如何使用邻接表来存储无向图,并实现求解连通分量个数的算法。 首先,我们来理解什么是图。在计算机科学中,图是一种...

    leetcode323. 无向图中连通分量的数目

    无向图中连通分量的数目”是关于寻找无向图中的连通分量数量的问题。连通分量是指图中任意两个节点之间都存在路径的子图,且这个子图是最大化的,即不能再添加其他节点而不破坏其连通性。 给定问题的输入包括两个...

    求一个无向图G的连通分量的个数.doc

    在本例中,我们需要设计一个算法来判断一个图有无回路,并计算无向图中的连通分量个数。 7. 数据结构的应用:在程序设计中,我们需要使用适当的数据结构来存储图中的数据。在本例中,我们使用了邻接表来存储图中的...

    algoboy101#note_blog_leetcode#[323]无向图中连通分量的数目1

    给定编号从 0 到 n-1 的 n 个节点和一个无向边列表(每条边都是一对节点),请编写一个函数来计算无向图中连通分量的数目。示例 1:输出: 2示例 2:输出

    jk.rar_图 连通_连通_连通分支_连通图

    对于无向图,可以构建一个二进制邻接矩阵,然后计算其指数。如果在计算过程中发现有非零的对角线元素,这意味着存在一个连通分支,且该顶点不在其他分支中。通过这种方法,我们可以逐步识别出所有的连通分支。 在...

    07A2 双连通分量分解:算法 | 实例1

    上述代码展示了一个用于计算无向图双连通分量的算法。这个算法基于深度优先搜索(DFS)进行,由`Graph, Te&gt;::BCC`函数实现。在这个函数中,`v`是当前正在访问的顶点,`clock`是一个计时器,用于为每个顶点分配发现...

    割点、桥和连通分量1

    而桥(Bridge)则是指在有向图或无向图中,删除某条边后会导致原本连通的图变成不连通的边,它是图中不可或缺的连接元素。 对于求解割点和桥的问题,可以使用深度优先搜索(DFS)或者Tarjan算法。Tarjan算法是一种...

    matlab判断图的连通性

    在图论中,如果在无向图中,任意两个顶点之间都存在路径,那么这个图被称为连通图。如果图不是连通的,即存在至少两个顶点之间没有路径,那么这个图就被称为非连通图。连通图可以进一步分为若干个互不相交的连通子图...

    基于离散粒子群算法的近似最大连通分量抽取.pdf

    最大连通分量抽取问题(MCP)是一种组合优化问题,它在无向图中寻找最大的连通子图。具体来说,如果在一个无向图G中,任意两个顶点都存在一条路径,则称该图为连通图。若存在顶点集V的子集,使得由此子集构成的子图...

    连通图分支算法

    计算无向图的连通分量个数,可以使用DFS或BFS遍历整个图。算法思路是从一个顶点开始,使用DFS或BFS访问所有可达的顶点,标记已访问的顶点,然后从下一个未访问的顶点继续此过程,每完成一次遍历,计数器加一,直到...

    Java编程实现深度优先遍历与连通分量代码示例

    任何连通图的连通分量只有一个,即是其自身,非连通的无向图有多个连通分量。 在Java中,实现深度优先遍历与连通分量的代码示例可以如下所示: 首先,定义一个Components类,用于计算无权图的连通分量: ```java ...

    数据结构:无向图连接矩阵

    6. **计算连通分量**:通过检查矩阵非零元素,可以确定图的连通性,找出所有连通的子图。 7. **空间效率**:无向图的邻接矩阵表示法在空间上可能不那么高效,特别是对于稀疏图(边的数量远小于节点数量的平方)。 ...

    通过连通矩阵来研究图的连通性

    对于无向图,邻接矩阵是对称的,其中的元素a[i][j]等于1,如果顶点i和j之间有边,否则等于0。对于有向图,邻接矩阵可能不对称,因为边的方向可能不同。通过分析邻接矩阵,我们可以快速检查两个顶点之间是否存在边,...

    图的连通_黄哲威.pdf

    强连通分量是无向图中的最大强连通子图,即图中最大的子集,其中的每个节点都可以通过有向边到达其他任何节点,同时也能被其他节点通过有向边到达。在给出的例子中,1,2,4,5,6,7,8 构成了一个强连通分量,而3,9各自...

    计算机课设毕设资料-基于云计算平台的图算法研究+答辩PPT.zip

    本文旨在对基于云计算的图算法进行研究,设计并实现了三个基本的图算法,这三个算法分别为无向图的连通分量算法,有向图的强连通分量算法以及无向图的Betweenness算法。首先,根据每个算法的特点设计了适当的数据...

    无向图的各项功能的课程设计

    【无向图的各项功能的课程设计】涉及到许多与图论和数据结构相关的知识点,以下是根据提供的标题、描述和部分内容详细解释这些知识点: 1. **插入顶点和边**:在图中添加新的顶点和边是基本操作。插入顶点通常意味...

Global site tag (gtag.js) - Google Analytics