有向图的邻接表的建立和个类算法的实现

邻接表创建 阅读详情
                有向图的邻接表的建立和个类算法的实现
//主题:用邻接表的方式实现有向图的一些算法

//作者:侯永华

//时间:2008年4月26日

//内容:具体实现:创建向图的邻接存储方式。打印邻接表的个顶点数据,
     //建立邻接表 void CreateAdj();
     //打印邻接表
  //void printAll();
  //删除邻接表
  //void Del(); 
  //深度优先搜索
  //void DFS(int V);
  //广度优先搜索
  //void BFS(int V);
  //队列实现拓扑排序
  //void TopSortQueue();
     //递归的拓扑排序
  //void TopSortbyDFS();
  //void Do_topsort(int V,int *result,int &tag);
  //Dijkstra算法的实现
  //void Dijkstra(int s);
  //Floyd算法的实现
  //void Floyd(Dist** &D);
     //其中很多用到的辅助的类,堆的方式在程序中都写出来了。用到队列的才用的VC中自带的队列。
//任务:测试所有数据的正确性。
//注意:本程序没有采用头文件形式,所有的节点存储都是从1开始的。

#include <iostream>
#include <queue>
using namespace std;

const int MaxNode=100;
const int VISITED=1;
const int UNVISITED=0;
const int INFINITY=10000;

struct Node
{
 int adjvex;          //边终点节点。
 int weight;
 struct Node *next;   //指向下个节点的指针。
};
class VNode
{
public:
 char data;           //节点数据
 struct Node* first;  //第一个节点边
 VNode(){}
 VNode(char Data,struct Node* firstVal)
 {
  data=Data;
  first=firstVal;
 }
 VNode(struct Node* firstVal)
 {
  first=firstVal;
 }
 
};
//最小值堆的建立
template <class T>
class MinHeap 
{
private:
 T* heapArray;
 int CurrentSize;
 int MaxSize;
public:
 MinHeap(const int n);
 virtual ~MinHeap()
 {delete []heapArray;};
 void BuildHeap();
 bool isLeaf(int pos) const;
 int leftchild(int pos) const;
 int rightchild(int pos) const;
 // Return parent position
 int parent(int pos) const;
 // 删除给定下标的元素
 bool Remove(int pos, T& node);
 void SiftDown(int left);
 //从position向上开始调整,使序列成为堆
 void SiftUp(int position);
 bool Insert(const T& newNode);
 T& RemoveMin();
 bool empty()
 {
  if(CurrentSize>0)
   return false;
  else
   return true;
 }
};

template<class T>
MinHeap<T>::MinHeap(const int n)
{
 if(n<=0)
  return;
 CurrentSize=0;
 MaxSize=n;
 heapArray=new T[MaxSize];
 BuildHeap();
}

template<class T>
void MinHeap<T>::BuildHeap()
{
 for (int i=CurrentSize/2-1; i>=0; i--)
  SiftDown(i);
}

template<class T>
bool MinHeap<T>::isLeaf(int pos) const
{
  return (pos>=CurrentSize/2)&&(pos<CurrentSize);
}

template<class T>
int MinHeap<T>::leftchild(int pos) const
{
 return 2*pos+1;      //返回左孩子位置
}

template<class T>
int MinHeap<T>::rightchild(int pos) const
{
 return 2*pos+2;      //返回右孩子位置
}

template<class T>
int MinHeap<T>::parent(int pos) const // 返回父节点位置
{
 return (pos-1)/2;
}

template<class T>
void MinHeap<T>::SiftDown(int left)
{
 //准备
 int i=left;       //标识父结点
 int j=2*i+1;      //标识关键值较小的子结点  
 T temp=heapArray[i];    //保存父结点
 //过筛
 while(j<CurrentSize)
 {
  if((j<CurrentSize-1)&&(heapArray[j]>heapArray[j+1]))
   j++;      //j指向右子结点
  if(temp>heapArray[j])
  {
   heapArray[i]=heapArray[j];
   i=j;
   j=2*j+1;
  }
  else break;
 }
 heapArray[i]=temp;
}

template<class T>
void MinHeap<T>::SiftUp(int position)
{//从position向上开始调整,使序列成为堆
 int temppos=position;
 T temp=heapArray[temppos];
 while((temppos>0)&&(heapArray[parent(temppos)]>temp))
 {
  heapArray[temppos]=heapArray[parent(temppos)];
  temppos=parent(temppos);
 }
 heapArray[temppos]=temp;
}

template<class T>
bool MinHeap<T>::Insert(const T& newNode)
{//向堆中插入一个结点
 if(CurrentSize==MaxSize)
  return false;
 heapArray[CurrentSize]=newNode;
 SiftUp(CurrentSize);
 CurrentSize++;
 return true;
}

template<class T>
T& MinHeap<T>::RemoveMin()
{
 if(CurrentSize==0)
 {
  cout<<"Can't Delete";

 }
 else
 {
  T temp=heapArray[0];     //取堆顶元素
  heapArray[0]=heapArray[CurrentSize-1]; //堆末元素上升至堆顶
  CurrentSize--;
  if(CurrentSize>1)
   SiftDown(0);      //从堆顶开始筛选
  return temp;
 }
}

template<class T>
bool MinHeap<T>::Remove(int pos, T& node)
{// 删除给定下标的元素
 if((pos<0)||(pos>=CurrentSize))
  return false;
 T temp=heapArray[pos];
 heapArray[pos]=heapArray[--CurrentSize]; //指定元素置于最后
 SiftUp(pos);        //上升筛
 SiftDown(pos);        //向下筛 
 node=temp;
 return true;
}


//Dijkstra的附加类
class Dist
{
public:
 int index;
 int length;
 int pre;
 Dist(){}
 ~Dist(){}
 bool operator<( const Dist &arg)
 {
  return (this->length<arg.length);
 }
 bool operator==(const Dist& arg)
 {
  return (this->length==arg.length);
 }
 bool operator>(const Dist& arg)
 {
  return (this->length>arg.length);
 }
 bool operator<=(const Dist &arg)
 {
  return (this->length<=arg.length);
 }
 bool operator>=(const Dist& arg)
 {
  return (this->length>=arg.length);
 }
};

 

class ADJ
{
private:
 int e;                  //边数
 VNode *AdjList; //顶点的邻接头
 int NNode;              //顶点数
 int MARK[MaxNode];      //标记数组
 int Indegree[MaxNode];  //入度的记数
public:
 ADJ(int itE,int itMaxNode)
 {
  e=itE;
  NNode=itMaxNode;
  AdjList=new VNode[NNode+1]; //所有的存储数组都是从1开始的。
  for(int i=0;i<NNode;i++)
  {
   AdjList[i].data=0;
   AdjList[i].first=NULL;
  }
  for(int j=0;j<MaxNode;j++)
   Indegree[j]=0;
 }
 ~ADJ()
 {
  delete[] AdjList;
 }
 //标记的位的清除
 void clearMark()
 {
  for(int i=0;i<MaxNode;i++)
   MARK[i]=0;
 }
 //建立邻接表
 void CreateAdj();
 //打印邻接表
 void printAll();
 //深度优先搜索
 void DFS(int V);
 //广度优先搜索
 void BFS(int V);
 //队列实现拓扑排序
 void TopSortQueue();
    //递归的拓扑排序
 void TopSortbyDFS();
 void Do_topsort(int V,int *result,int &tag);
 //Dijkstra算法的实现
 void Dijkstra(int s);
 //Floyd算法的实现
 void Floyd(Dist** &D);

};

//建立邻接表
void ADJ::CreateAdj()
{
  int i,j;
  int item;
  struct Node* S;
  for(int a=1;a<=NNode;a++)
  {
   cout<<"输入第"<<a<<"个顶点数据";
   cin>>AdjList[a].data;
   AdjList[a].first=NULL;
  }
  for(int k=0;k<e;k++)
  {
   cout<<"输入边<Vi,Vj>的顶点对序列号:";
   cin>>i;
   cin>>j;
   cout<<"输入权值:";
   cin>>item;
            S=new struct Node();
   S->adjvex=j;
   S->weight=item;
   S->next=AdjList[i].first;
   AdjList[i].first=S;        //连接下个节点。
   Indegree[j]++;            //入度记熟。
  }
}

//打印图的所有接点
void ADJ::printAll()
{
  cout<<"打印所有顶点的连接;"<<endl;
  for(int i=1;i<=NNode;i++)
  {
   struct Node* temp=AdjList[i].first;
   cout<<i;
   cout<<"("<<AdjList[i].data<<")";
   if(temp!=NULL)
    cout<<"---"<<temp->weight<<"-->";
   while(temp!=NULL)
   {
    cout<<temp->adjvex;
    cout<<"("<<AdjList[temp->adjvex].data<<")"<<"--"<<temp->weight<<"-->";
    temp=temp->next;
   }
   cout<<"---->NULL";
   cout<<endl;
  }
  cout<<"输出了所有数据!"<<endl;
}


//深度优先搜索递归实现
void ADJ::DFS(int V)
{
  struct Node* Temp;
  cout<<AdjList[V].data<<"====>>";
  MARK[V]=VISITED;
  Temp=AdjList[V].first;
  while(Temp!=NULL)
  {
   if(MARK[Temp->adjvex]==UNVISITED)
    DFS(Temp->adjvex);
   Temp=Temp->next;
  }
}


//广度优先搜索算法的队列实现
void ADJ::BFS(int V)
{
 using std::queue;
 queue<int> Q;
 struct Node* temp;
 cout<<AdjList[V].data<<"-->";
 MARK[V]=VISITED;
 Q.push(V);
 while(!Q.empty())
 {

  int V=Q.front();
  Q.pop();
  temp=AdjList[V].first;
  while(temp!=NULL)
  {
   if(MARK[temp->adjvex]==UNVISITED)
   {
    cout<<AdjList[temp->adjvex].data<<"-->";
    MARK[temp->adjvex]=VISITED;
    Q.push(temp->adjvex);
   }
   temp=temp->next;
  }
 }
}

//拓扑排序的队列实现
void ADJ::TopSortQueue()
{
 clearMark();
 using std::queue;
 queue<int> Q;
 struct Node* temp;
 for(int i=1;i<=NNode;i++)
  if(Indegree[i]==0)
   Q.push(i);
 while(!Q.empty())
 {
  int V=Q.front();
  Q.pop();
  cout<<AdjList[V].data<<"-->";
  MARK[V]=VISITED;
  temp=AdjList[V].first;
  while(temp!=NULL)
  {
   Indegree[temp->adjvex]--;
   if(Indegree[temp->adjvex]==0)
    Q.push(temp->adjvex);
   temp=temp->next;
  }
 }
 for(int i=1;i<=NNode;i++)
  if(MARK[i]==UNVISITED)
  {
   cout<<"此图有环!";
   break;
  }
}
//DFS实现的拓扑排序
void ADJ::TopSortbyDFS()
{
 clearMark();
 int *result=new int[NNode];
 int tag=1;
 for(int i=1;i<=NNode;i++)
  if(MARK[i]==UNVISITED)
   Do_topsort(i,result,tag);
 for(int i=NNode;i>=1;i--)
        cout<<result[i]<<"--->";
}

void ADJ::Do_topsort(int V,int *result,int &tag)
{
 MARK[V]=VISITED;
 struct Node *temp=AdjList[V].first;
 while(temp!=NULL)
 {
  if(MARK[temp->adjvex]==UNVISITED)
   Do_topsort(temp->adjvex,result,tag);
  temp=temp->next;
 }
 result[tag++]=V;
}
//Dijkstra算法的实现

void ADJ::Dijkstra(int s )
{
  Dist *D=new Dist[NNode+1];
 for(int i=1;i<=NNode;i++)
 {
  MARK[i]=UNVISITED;
  D[i].index=i;
  D[i].length=INFINITY;
  D[i].pre=s;
  
 }
 D[s].length=0;
 MinHeap<Dist> H(NNode);
 H.Insert(D[s]);
 for(int i=1;i<=NNode;i++)
 {
  
  bool FOUND=false;
  Dist d;
  while(!H.empty())
  {
   d=H.RemoveMin();
   if(MARK[d.index]==UNVISITED)
   {
    
    FOUND=true;
    break;
   }
  }
  
  if(!FOUND)
   break;
  int v=d.index;
  MARK[v]=VISITED;
  cout<<AdjList[v].data<<"--->";
  struct Node *temp=AdjList[v].first;
  
  while(temp!=NULL)
  {
   if((D[temp->adjvex].length>(D[v].length+temp->weight))&&MARK[temp->adjvex]==UNVISITED)
   {
    D[temp->adjvex].length=D[v].length+temp->weight;
    D[temp->adjvex].pre=v;
    H.Insert(D[temp->adjvex]);
    
    
   }
   temp=temp->next;
  }

 }
 cout<<"输出重新刷新权值号的个顶点的最短路径权值!";
 for(int j=1;j<=NNode;j++)
  cout<<j<<"("<<D[j].length<<") -->";
}

//Floyd算法的实现

void ADJ:: Floyd(Dist** &D)
{
 int i,j,v;
 struct Node* temp;
 
 D=new Dist*[NNode+1];
 for(i=1;i<=NNode;i++)
  D[i]=new Dist[NNode+1];
 for(i=1;i<=NNode;i++)
  for(j=1;j<=NNode;j++)
   if(i==j)
   {
    D[i][j].length=0;
    D[i][j].pre=i;
   }
   else
   {
    D[i][j].length=INFINITY;
    D[i][j].pre=0;
   }
     for(v=1;v<=NNode;v++)
  {
   temp=AdjList[v].first;
   while(temp!=NULL)
   {
    D[v][temp->adjvex].length=temp->weight;
    D[v][temp->adjvex].pre=v;
    temp=temp->next;
   }
  }
  for(v=1;v<=NNode;v++)
   for(i=1;i<=NNode;i++)
    for(j=1;j<=NNode;j++)
     if(D[i][j].length>(D[i][v].length + D[v][j].length))
     {
      D[i][j].length=D[i][v].length+D[v][j].length;
      D[i][j].pre=v;
     }
  for(i=1;i<=NNode;i++)
  {
   //打印前一顶点的矩阵
   for(j=1;j<=NNode;j++)
    cout<<D[i][j].pre<<"/t";
   cout<<endl;
  }
  cout<<"打印最短路径矩阵:"<<endl;
  for(i=1;i<=NNode;i++)
  {
   for(j=1;j<=NNode;j++)
    cout<<D[i][j].length<<"/t";
   cout<<endl;
  }

}

void DefineProgram()
{
 cout<<"-------------------------------------------------------------"<<endl;
 cout<<"/t0----退出程序不做任何的输出信息:"<<endl;
 cout<<"/t1----打印所有顶点的信息:"<<endl;
 cout<<"/t2----深度优先搜索顶点:"<<endl;
 cout<<"/t3----广度优先搜索顶点:"<<endl;
 cout<<"/t4----队列实现拓扑排序:"<<endl;
 cout<<"/t5----DFS实现拓扑排序:"<<endl;
 cout<<"/t6----单源的最短路径的实现"<<endl;
 cout<<"/t7----两顶点间的最短路径:"<<endl;
 cout<<"-------------------------------------------------------------"<<endl;
 cout<<"请输入你需要的选择项:"<<endl;

}

int main()
{
 int E,MaxNode;
 int item,item2;
 int tag=100;
 Dist **D;

 cout<<"输入有向图的顶点数和边数::";
 cin>>MaxNode>>E;
 ADJ T(E,MaxNode);
 T.CreateAdj();
 DefineProgram();
 cin>>tag;
 while(tag!=0)
 {
  switch(tag)
  {
  case 1:
   T.printAll();
   cout<<endl;
   break;
  case 2:
   cout<<"输入你要开始的深度优先搜索顶点:";
         cin>>item;
         cout<<"输出顶点的深度优先搜索顺序:";
         T.clearMark();
         T.DFS(item);
   cout<<endl;
   break;
  case 3:
   cout<<"输入你要开始的广度优先搜索顶点:";
         cin>>item;
   T.clearMark();
         cout<<endl;
         cout<<"输出顶点的广度优先搜索顺序:";
         T.BFS(item);
   cout<<endl;
   break;
  case 4:
   T.clearMark();
         cout<<endl;
         cout<<"输出队列实现的拓扑排序:";
         T.TopSortQueue();
         cout<<endl;
   break;
  case 5:
   cout<<"输出DFS实现的拓扑排序:";
         T.TopSortbyDFS();
         cout<<endl;
   break;
  case 6:
   cout<<"输入一个顶点到其他顶点最近的距离:";
         cin>>item2;
         cout<<endl;
         cout<<"单源的最短路径";
         T.clearMark();
         T.Dijkstra(item2);
         cout<<endl;
   break;
  case 7:
   cout<<"查看两个顶点的最小距离:"<<endl;
         T.Floyd(D);
   cout<<endl;
   break;
  default:
   cout<<"请重新输入正确数字:"<<endl;
   break;
  }
  DefineProgram();
  cin>>tag;
 }
 
 return 0;
}

注:

  此程序在VC2005中运行通过的。

无向图邻接表实现 无向图的邻接表的实现 阅读详情

相关推荐

【数据结构与算法】图——邻接表与邻接矩阵

邻接表与邻接矩阵

qq_66314292的博客 1万+

【数据结构】图算法

图的邻接表定义及创建 、无向图上实现深度优先算法 、无向图上实现广度优先遍历算法 、有向无环图上实现拓扑排序算法

Y0704__00的博客 1198

实现图的邻接矩阵和邻接表存储

/** *    实验题目: *        实现图的邻接矩阵和邻接表存储 *    实验目的: *        领会图的两种主要存储结构和图基本运算算法设计 *    实验内容: *        编写程序,设计带权图的邻接矩阵与邻接表的创建和输出运算, *    并在此基础上设计一个主程序,完成如下功能: *    1、建立如图8-1所示的有向图G的邻接矩阵,并输出之。 *    2、建立...

xiezhi123456的博客 1万+

图论算法——有向图的邻接链表实现

引言 给定有向图如下: 注意0和2节点之间的双向箭头表示0→2和2→0的两条边。 代码 package com.algorithms.graph; import java.util.HashSet; import java.util.Set; /** * 有向图 * * @author yjw * @date 2019/5/15/015 */ @SuppressWarnings("...

日积月累,天道酬勤 5175

建立有向图的邻接表存储 进行深度优先遍历

#include<stdio.h> #include<malloc.h> #define Vextype char #define Edgetype int #define MaxVerNum 30 /* 最大顶点个数 */ typedef struct ArcNode /*边结点*/ { int adjvex; /*该边所指向的顶点的位置*/ struct ArcNode * nextarc; /*指向下一条边的指针*/ }Ar

tygmc的博客 2148

图的存储结构——邻接表的建立

邻接表(无向图)

花开不败 1万+

算法基础(十):--有向图的邻接表创建

邻接表=邻接链表。 我觉得,还是要自己写写,写出来,理解才会更深一点,以前眼高手低,不知其中厉害啊。 其实还是蛮有趣的!我觉得,还是要把数据结构学好,这真的很重要,工具总是在变,但是思想才是最重要的,希望自己

Less Is More 9366

conda环境的复制、备份操作

请确保将 source_env 替换为你要复制的现有环境的名称,并将 target_env 替换为你要创建的新环境的名称。要备份一个Conda虚拟环境,你需要将环境的配置信息和依赖包列表保存起来,以便在需要的时候能够重新创建相同的环境。要将现有的 conda 环境复制为其他环境,可以使用 conda create 命令并克隆已存在的环境。

Dollhan的博客 3773

C语言建立有向图的邻接表及其遍历操作

C语言建立有向图的邻接表及其遍历操作 1 /*C语言建立有向图的邻接表及其遍历操作*/ 2 #include"stdio.h" 3 #include"stdlib.h" 4 //图的邻接矩阵储存结构 5 typedef char elemtype; 6 #define maxsize 10 7 #define queuesize 100 8 //边结点的类型定义 9...

qq_41502099的博客 1万+

【Python】SimpleITK使用笔记

1. 概念 1.1 nii格式 1.2 SimpleITK 1.3 SimpleITK 图像 2. 基本操作 2.1 常见属性 2.1 读取和保存图像 2.2 SimpleITK图像数据和Numpy矩阵数据之间的转换

See_Star的博客 7898

Frida Stalker实战:如何用指令级追踪破解OLLVM混淆的AES算法

本文深入探讨了如何使用Frida Stalker进行指令级追踪,破解经过OLLVM混淆的AES算法。通过动态分析技术,逆向工程师可以精准识别控制流平坦化等混淆手段,还原算法逻辑,特别适用于移动安全领域的加密算法分析。文章提供了详细的配置指南、核心机制解析和实战案例,帮助读者掌握对抗高级代码混淆的有效方法。

weixin_29325955的博客 475

使用邻接表创建无向图和有向图

图的邻接表表示法: 邻接表(Adjacency List) 是图的 一 种链式存储结构。在邻接表中,对图中每个顶点V建立一个单链表,把与 V相邻接的顶点放在这个链表中。邻接表中每个单链表的第一个结点存放有关顶点的信息, 把这 一 结点看成链表的表头, 其余结点存放有关边的信息, 这样邻接表便由两部分组成:表头结点表和边表。 (1) 表头结点表:由所有表头结点以顺序结构的形式存储, 以便可以随机访问任 一 顶点的边链表。表头结点包括数据域 (data) 和链域 (firstarc) 两部分。其中, 数据域

千言万语ROOM 1万+

SRAM ECC原理与应用:从汉明码到高可靠嵌入式系统设计

在嵌入式系统与高可靠性计算领域,内存数据完整性是系统稳定运行的基石。软错误(Soft Error)由宇宙射线或芯片内部粒子引发,可能导致存储单元发生位翻转,进而引发程序跑飞或数据损坏。为应对这一物理层挑战,错误校验与纠正(ECC)技术应运而生,其核心原理基于扩展汉明码,通过增加校验位实现单错误纠正、双错误检测(SECDED)能力。这项技术通过硬件透明纠错,在提升系统可靠性的同时,几乎不影响访问性能。在汽车电子、工业控制及航空航天等对安全性要求极高的场景中,ECC已成为保障长期稳定运行的关键硬件机制。本文聚焦

weixin_28728265的博客 531

图2——利用邻接表创建有向图

图2——利用邻接表创建有向图 图 假设以邻接表作为图的存储结构,编写算法,创建有向图并输出邻接表。 主要考查对邻接表的理解。图的邻接表分为两个部分:表头结点和边表结点,因此创建有向图也分成两部分:一是创建表头结点,二是创建边表结点构成的边表。 创建表头结点就是根据输入的结点信息,将结点信息直接存入对应的数据域中,并且将该结点的指针域置为NULL。 for(int i=0;i<G-...

凌空的桨 1万+

C/C++基础讲解(四十三)之图形篇之绘制直线、圆、圆弧、 椭圆

程序主要是基于Visual studio 2019进行编译完成了,有兴趣的小伙伴可以自己安装下Visual studio 2019,网上有现成的教程,当然了,如果有问题,也可以和我联系,这里我们主要讲解些源码实例,不多说了,言归正传。 C语言,做为学习其他语言的基础语言,其重要性就不言而喻了.下面我将和大家一起来学习探讨C语言的相关奥秘。 实例1:绘制直线 实例2:绘制圆 实例2:绘制圆弧 实例2:绘制椭圆

hnjzfwy的博客 1235

基于Matlab的磁力计校准(附源码)

磁力计沿传感器的 X、Y 和 Z 轴检测磁场强度。精确的磁场测量对于传感器融合以及确定航向和方向至关重要。为了用于航向和方向计算,需要校准典型的低成本MEMS磁力计,以补偿环境噪声和制造缺陷。一、理想磁力计理想的三轴磁力计沿正交 X、Y 和 Z 轴测量磁场强度。在没有任何磁干扰的情况下,磁力计读数测量地球磁场。如果在传感器通过所有可能的方向旋转时进行磁力计测量,则测量值应位于球体上。球体的半径是磁场强度。要生成磁场样本,请使用对象。出于这些目的,可以安全地假设每个方向的角速度和加速度为零。

珞瑜的博客 4520

图的邻接表的建立

图的邻接表表示法类似于树的孩子链表表示法。对于图G中的每个顶点vi,该方法把所有邻接于vi的顶点vj链成一个带头节点的单链表,这个单链表就称为顶点vj的邻接表。 单链表中的每个结点至少包含两个域,一个为邻接点域(adjvex),它指示与顶点vi邻接的顶点在图中的位序;另一个为链域,它指示与顶点vi邻接的下一个节点。如果是网络,可以在单链表的头节点中增加一个数据域用于存储和边(弧)相关的信息,如权值...

qq_43613793的博客 4606

手把手教你从入门到精通C# 操作MySql数据库

本文是《C#操作MySql数据库从入门到精通》专栏的导读,帮助大家知道学习本专栏能够获取什么!

qq_34059233的博客 1933

邻接表实现有向图BFS、DFS、拓扑排序

图的大家族 常用图的存储结构有两种:邻接矩阵,邻接表。一个数组,一个链表,可见复杂的数据结构是建立在基础结构之上的,在这里选择邻接表存储,边比较少时省空间。 图按照有无方向,有无权重,分为四类 无向无权:无向图 无向有权:无向网 有向无权:有向图 有向有权:有向网 可见带有权重称为网,否则称为图。 图可以看成边权均为1,所以是特殊网。因此掌握了网,也就顺带会了图 由于无向图均有对称性,所以大...

努力做个书呆儿 5479

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

c++有向图的邻接表的创建与输出

有向图的邻接表的创建与输出 算法: #include <iostream> using namespace std; #define MaxVexNum 100//顶点的最大个数 typedef char VerTexData;//顶点数据类型 typedef int EdgeData;//边权值的类型 typedef struct node//边界点 { int dest;//目标节点位置 EdgeData cost;//边的权值 struct node *link;/

鹅鹅的博客 6431

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

图的存储结构——邻接表

图的存储结构之邻接表一、邻接表表示法无向图的邻接表有向图的邻接表有向图的逆邻接表二、图的邻接表存储表示 一、邻接表表示法 回忆在线性表时,顺序存储结构就存在预先分配内存可能造成存储空间浪费的问题,于是引出了链式存储结构,同样的,我们可以考虑对边或弧使用链式存储方式来避免空间浪费问题 邻接表是图的一种链式存储结构。 由两部分组成:表头结点表和边表。 邻接表中每个单链表的第一个结点存放有关顶点的信...

ker的博客 5万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

数据结构 c语言 有向图和无向图邻接表的建立、插入、和删除操作

c语言实现数据结构中有向图和无向图邻接表的建立、插入、删除操作

想变得强大,虽然现在还弱不禁风 1万+

图的建立(邻接表)

图建立之邻接表 图的建立是需要通过传入图对应的信息才能建立的,而邻接矩阵和邻接表就是这个作用。 邻接表是对邻结矩阵的改进,在邻接矩阵中才用一个一维数组记录顶点,一个二维数组记录顶点所对应的边,如果当图中每个顶点之间连线很少的情况下,同样要依次遍历二维数组中的该顶点与其他顶点的关系来确定边,导致效率低下。 而邻接表则是一个结构体指针数组,该结构体又是一个链表的头结点,即这个数组中只记录了该结点已连接...

weixin_42889383的博客 5429

邻接表详解(C/C++)

一、概念 二、分类 1)无向图的邻接表 2)有向图的邻接表(出弧) 3)有向图的逆邻接表(入弧) 三.步骤 四、代码

莫浅子的博客 4万+
上一篇: 无向图的最小支撑树Prim算法的实现
下一篇: 败者树的实现(c++)
Garyhou
博客等级 码龄20年 41粉丝 62原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值