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

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

//作者:侯永华

//时间: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

华为海思IC前端中后端(COT&XPU)岗位笔试机考题

华为海思COT和XPU部门IC前端,IC中端,IC后端岗位笔试真题分享

weixin_37584728的博客 3362

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万+

告别Keil!用VSCode+PlatformIO玩转STC单片机(附自动下载配置)

本文详细介绍了如何从Keil迁移到VSCode+PlatformIO进行STC单片机开发,包括环境搭建、自动下载配置等实用技巧。通过对比传统IDE与现代工具链的差异,展示了VSCode+PlatformIO在代码编辑体验、跨平台支持和开发效率上的优势,帮助开发者实现更流畅的STC单片机开发流程。

weixin_27252001的博客 458

Docker部署OnlyOffice踩坑实录:解决editor.bin下载失败的3种姿势

本文详细解析了Docker部署OnlyOffice时editor.bin下载失败的常见原因,并提供了三种核心解决方案。重点剖析了容器网络配置、Nginx反向代理(特别是proxy_pass设置)以及安全策略调整,帮助开发者彻底解决静态资源加载问题,确保文档协作平台稳定运行。

weixin_29281941的博客 872

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

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

千言万语ROOM 1万+

安装Anaconda和Labelme的教程

1 登录Anaconda官网,选择Download https://www.anaconda.com/distribution/ 2 选择你想下载的Python版本,选择你的操作系统和位数,然后点击Download按钮就开始下载了 3 开始安装 下面两个框框都勾选 点击next,等待安装成功 打开Anaconda Navigator 点击红色圈圈的按钮 在cmd中输入 (1)创建虚拟环境 conda create -n labelme python=3.6 (2)激活虚拟环境 conda activa

qq_42178122的博客 3811

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

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

凌空的桨 1万+

VSCode上搭建C/C++开发环境(vscode配置c/c++环境)Windows系统---保姆级教程

关于VSCode上搭建C/C++开发环境的内容,到这里就结束了,这里博主感叹一下,VSCode真的挺强大的,作为一个编辑器,可以通过和编译器链接成为开发环境,将环境配置好的话,在这上面写代码似乎也是个不错的选择。大家有任何疑问,欢迎在评论区中提出,本篇博客有任何问题和错误也欢迎来和博主讨论,真心希望能和大家一起进步。最后,如果本篇博客对你有帮助的话,能不能给博主一个三连啊!

2303_79329831的博客 8万+

构建 Skill 的完整指南

Skill开发指南摘要 Skill是用于定制Claude AI行为的指令包,包含SKILL.md主文件及可选脚本、参考文档和资源。本文提供了完整的Skill开发指南: 核心概念 三层渐进式披露结构(元数据/主指令/参考文档) 支持独立工作流和MCP集成 跨平台兼容性(Claude.ai/ClaudeCode/API) 开发流程 规划:明确2-3个具体用例 结构要求:kebab-case命名、必备YAML元数据 编写规范:清晰触发条件、分步指令、错误处理 典型应用模式 • 文档生成(类别1) • 工作流自动化

wjianwei666的专栏 298

图的邻接表的建立

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

qq_43613793的博客 4606

C#版OpenCV:OpenCVSharp 最详细最全面教程(万字详细总结)

OpenCVSharp 是一个用于 .NET 环境的 OpenCV 包装库,它提供了一种简便的方法来利用 OpenCV 的功能进行图像和视频处理。OpenCV(Open Source Computer Vision Library)是一个开源计算机视觉和机器学习软件库,最初由 Intel 研发并发布。OpenCVSharp 让 C# 和其他 .NET 语言的开发者可以方便地访问 OpenCV 的强大功能。// 打印 OpenCV 版本信息Cv2。

仰望星空的博客 2万+

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

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

努力做个书呆儿 5479

①电子产品拆解分析-暖手宝

电子产品拆解分析-暖手宝 ①按键三档调温暖手; ②长按进入氛围呼吸灯; ③安卓接口充电以及支持USB输出;

a6662580的博客 5295

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

图的存储结构——邻接表

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

ker的博客 5万+

jre9下载 jdk9

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

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

数据结构 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、付费专栏及课程。

余额充值