基于邻接表的图建立(有向图+无向图)

图的表示(建立)有两种方法:

①邻接矩阵:A(i,j)=1表示i,j存在一条边,空间复杂度O(n^2),稠密图

②邻接表:只记录存在的边,Vector+List的数据结构,稀疏图

邻接矩阵的图建立这里不做赘述,接下来我们看一下邻接表的图建立:

<1>有向图

注意理解头插入节点的过程

int  n,m;//n表示城镇个数,m表示道路条数</span>

struct LinkNode//列表节点
{
	int vex; //邻接的结点在数组中的编号
	LinkNode* next;
};
struct Node//邻接表
{
	int data;
	LinkNode* head;//列表头节点
} Adj[maxn];

//生成无向图(邻接表实现)Vector+List
void createLink(){
  LinkNode *ptr1,*ptr2;//首先声明两个空节点
  for(int i=1;i<=n;i++) Adj[i].head=NULL;
  for(int i=1;i<=m;i++){
     ptr1=new LinkNode;
     scanf("%d",&ptr1->vex);
    //头插入建表,非常关键,注意理解head的位置
     ptr2=new LinkNode;
     scanf("%d",&ptr2->vex);
     //有向图头插入建立列表过程,只需一次
     ptr2->next=Adj[ptr1->vex].head;
     Adj[ptr1->vex].head=ptr2;
  }
}
int main()
{
	//freopen("input.txt","r",stdin);
    while(scanf("%d%d",&n,&m)!=EOF){  //基于邻接表,速度快
     createLink();
    }
	return 0;
}

<2>无向图

基于有向图,插入两次即可

int  n,m;//n表示城镇个数,m表示道路条数

struct LinkNode//列表节点
{
	int vex; //邻接的结点在数组中的编号
	LinkNode* next;
};
struct Node//邻接表
{
	int data;
	LinkNode* head;//列表头节点
} Adj[maxn];

//生成无向图(邻接表实现)Vector+List
void createLink(){
  LinkNode *ptr1,*ptr2;//首先声明两个空节点
  for(int i=1;i<=n;i++) Adj[i].head=NULL;
  for(int i=1;i<=m;i++){
     ptr1=new LinkNode;
     scanf("%d",&ptr1->vex);
    //头插入建表,非常关键,注意理解head的位置
     ptr2=new LinkNode;
     scanf("%d",&ptr2->vex);
     ptr2->next=Adj[ptr1->vex].head;
     Adj[ptr1->vex].head=ptr2;
     //无向图邻接表建立
     ptr1->next=Adj[ptr2->vex].head;
     Adj[ptr2->vex].head=ptr1;
  }
}
int main()
{
    //freopen("input.txt","r",stdin);
    while(scanf("%d%d",&n,&m)!=EOF){  //基于邻接表,速度快
     createLink();
    }
	return 0;
}
时间: 2024-10-25 21:33:51

基于邻接表的图建立(有向图+无向图)的相关文章

数据结构实验之图论二:基于邻接表的广度优先搜索遍历

数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) 输入 输入第一行为整数n(0< n <100),表示数据的组数. 对于每组数据,第一行是三个整数k,m,t(0<k<100,0<m<(k-1)*k/2,

SDUT 2142 【TEST】数据结构实验之图论二:基于邻接表的广度优先搜索遍历

数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) Input 输入第一行为整数n(0< n <100),表示数据的组数.对于每组数据,第一行是三个整数k,m,t(0<

生化危机 邻接表存图+BFS

生化危机 发布时间: 2015年10月10日 18:05   时间限制: 1000ms   内存限制: 256M 描述 X博士想造福人类, 研发一种可以再生肢体的药物, 可是很不幸......研究失败了, 他在蜥蜴身上实验的时候, 蜥蜴发生了变异, 更糟糕的是, 蜥蜴逃出了生化实验室. 恐怖的事情发生了, 疫情以X博士所在的城市为中心向四周扩散开, 最终, 整个地球上的城市都被感染了.假设整个地球一共有N个城市, 这N个城市是连通的, 有N-1条通道把他们连接起来.病毒会以一座城市为中心,在一天

hdu 2647 (拓扑排序 邻接表建图的模板) Reward

题目链接http://acm.hdu.edu.cn/showproblem.php?pid=2647 老板给员工发工资,每个人的基本工资都是888,然后还有奖金,然后员工之间有矛盾,有的员工希望比某员工的奖金多,老板满足了所以员工的这种心思,而且老板下午发的总工资最少,问最少是多少?比如 a b 表示a的工资比b要高(高一块钱),当出现a b   b c   c a这种环的时候输出-1 拓扑排序http://www.cnblogs.com/tonghao/p/4721072.html 小指向大

邻接矩阵(以顶点为中心),比较稀疏时,采用邻接表;图的两种遍历(邻接矩阵实现)

对于边比较稠密的图,可以采用邻接矩阵(以顶点为中心)的方式表示,而边比较稀疏时,采用邻接表的结构更合适.两种都不能直观表达哪两个点相连或者最短路径是什么. 深度优先遍历类似于树的先根序遍历.与树不同的是,它需要对已经访问过的节点添加标记以免被重复遍历. public class Depth { /** * 对k号节点深度遍历 * @param a * @param color * @param k 节点 */ public static void depthTraversal(int[][] a

PTA 邻接表存储图的广度优先遍历(20 分)

6-2 邻接表存储图的广度优先遍历(20 分) 试实现邻接表存储图的广度优先遍历. 函数接口定义: void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) ); 其中LGraph是邻接表存储的图,定义如下: /* 邻接点的定义 */ typedef struct AdjVNode *PtrToAdjVNode; struct AdjVNode{ Vertex AdjV; /* 邻接点下标 */ PtrToAdjVNode Next; /*

HDU 4857 逃生(拓扑排序逆向+邻接表存图)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4857 题目: Problem Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前.同时,社会是不平等的,这些人有的穷有的富.1号最富,2号第二富,以此类推.有钱人就贿赂负责人,所以他们有一些好处. 负责人现在可以安排大家排队的顺序,由于收了好处,所以他要让1号尽量靠前,

6-1 邻接表存储图的广度优先遍历 (20 分)

6-1 邻接表存储图的广度优先遍历 (20 分) 试实现邻接表存储图的广度优先遍历. 函数接口定义: void BFS ( LGraph Graph, Vertex S, void (*Visit)(Vertex) ); 其中LGraph是邻接表存储的图,定义如下: /* 邻接点的定义 */ typedef struct AdjVNode *PtrToAdjVNode; struct AdjVNode{ Vertex AdjV; /* 邻接点下标 */ PtrToAdjVNode Next; /

基于邻接表存储的图的深度优先遍历和广度优先遍历

一.深度优先遍历是连通图的一种遍历策略.其基本思想如下: 设x是当前被访问顶点,在对x做过访问标记后,选择一条从x出发的未检测过的边(x,y).若发现顶点y已访问过,则重新选择另一条从x出发的未检测过的边,否则沿边(x,y)到达未曾访问过的y,对y访问并将其标记为已访问过:然后从y开始搜索,直到搜索完从y出发的所有路径,即访问完所有从y出发可达的顶点之后,才回溯到顶点x,并且再选择一条从x出发的未检测过的边.上述过程直至从x出发的所有边都已检测过为止. 例如下图中: 1.从0开始,首先找到0的关