数据结构----邻接矩阵-邻接表


要表示一个图G=(V,E),有两种标准的表示方法,即邻接表和邻接矩阵。这两种表示法既可用于有向图,也可用于无向图。通常采用邻接表表示法,因为用这种方法表示稀疏图(图中边数远小于点个数)比较紧凑。但当遇到稠密图(|E|接近于|V|^2)或必须很快判别两个给定顶点手否存在连接边时,通常采用邻接矩阵表示法,例如求最短路径算法中,就采用邻接矩阵表示。


#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#define MAXN 50

//邻接矩阵
int edge[MAXN][MAXN];
int other(){
	int i,j;
	int n,m;
	int u,v;
	int od,id;
	while(1){
		scanf("%d%d",&n,&m);
		if(n==0 && m==0){
			printf("没有输入边和点的个数\n");
			break;
		}
		memset(edge, 0, sizeof(edge));
		for(i=0;i<m;i++){
			scanf("%d%d",&u,&v);
			edge[u-1][v-1] = 1;
		}
		for(i=0;i<n;i++){
			od = 0;
			for(j=0;j<n;j++){
				od += edge[i][j];
			}
			if(i==0){
				printf("%d",od);
			}
			else{
				printf(" %d",od);
			}
		}
		printf("\n");
		for(i=0;i<n;i++){
			id =0;
			for(j=0;j<n;j++){
				id += edge[j][i];
			}
			if(i==0){
				printf("%d",id);
			}
			else{
				printf(" %d",id);
			}
		}
		printf("\n");
		}
	return 0;
}

//邻接表
typedef struct arcnode * arc;

typedef struct vnode * vno;

typedef struct lgraph * lgr;
struct arcnode{
	int id;
	arc  next_arcnode;
};

struct vnode{
	int id;
	arc inhead;
	arc outhead;
};

struct lgraph{
	struct vnode vnodes[MAXN];
	int vex=0;
	int arc=0;
};

lgr create_null_lg(){

}

lgr create_lg(lgr lg){
	int i;
	int n,m;
	arc p=NULL;
	for(i=0;i<lg->vex;i++){
		lg->vnodes[i].inhead = lg->vnodes[i].outhead = NULL;
	}
	for(i=0;i<lg->arc;i++){
		scanf("%d%d",&n,&m);
		n--;
		m--;
		p = (arc)malloc(sizeof(struct arcnode));
		p->id = m;
		p->next_arcnode = lg->vnodes[n].inhead;
		lg->vnodes[n].inhead = p;
		p = (arc)malloc(sizeof(struct arcnode));
		p->id = n;
		p->next_arcnode = lg->vnodes[m].outhead;
		lg->vnodes[m].outhead = p;
	}
	return lg;
}

void free_lg(lgr lg){
	int i;
	arc p;
	for(i=0;i<lg->vex;i++){
		p = lg->vnodes[i].inhead;
		while(p!=NULL){
			lg->vnodes[i].inhead = p->next_arcnode;
			free(p);
			p = lg->vnodes[i].inhead;
		}
		p = lg->vnodes[i].outhead;
		while(p!=NULL){
			lg->vnodes[i].outhead = p->next_arcnode;
			free(p);
			p = lg->vnodes[i].outhead;
		}
	}
}

int main(){
	int i;
	int m,n;
	int id,od;
	arc p;
	struct lgraph lg;
	while(1){
		printf("输入多少条边和点");
		scanf("%d%d",&(lg.vex),&(lg.arc));
		if(lg.vex==0){
			break;
		}
		create_lg(&lg);
		for(i=0;i<lg.vex;i++){
			od =0;
			p = lg.vnodes[i].inhead;
			while(p!=NULL){
				od ++;
				p = p->next_arcnode;
			}
			if(i==0){
				printf("%d",od);
			}
			else{
				printf(" %d",od);
			}
		}
		printf("\n");
		for(i=0;i<lg.vex;i++){
			id =0;
			p = lg.vnodes[i].outhead;
			while(p!=NULL){
				id ++;
				p = p->next_arcnode;
			}
			if(i==0){
				printf("%d",id);
			}
			else{
				printf(" %d",id);
			}
		}
		printf("\n");
		free_lg(&lg);
	}
	return 0;
}

原文地址:https://www.cnblogs.com/hywhyme/p/11610929.html

时间: 2024-10-03 14:55:52

数据结构----邻接矩阵-邻接表的相关文章

图基本算法 图的表示方法 邻接矩阵 邻接表

要表示一个图G=(V,E),有两种标准的表示方法,即邻接表和邻接矩阵.这两种表示法既可用于有向图,也可用于无向图.通常采用邻接表表示法,因为用这种方法表示稀疏图(图中边数远小于点个数)比较紧凑.但当遇到稠密图(|E|接近于|V|^2)或必须很快判别两个给定顶点手否存在连接边时,通常采用邻接矩阵表示法,例如求最短路径算法中,就采用邻接矩阵表示. 图G=<V,E>的邻接表表示是由一个包含|V|个列表的数组Adj所组成,其中每个列表对应于V中的一个顶点.对于每一个u∈V,邻接表Adj[u]包含所有满

数据结构学习笔记05图 (邻接矩阵 邻接表--&gt;BFS DFS)

数据结构之图 图(Graph) 包含 一组顶点:通常用V (Vertex) 表示顶点集合 一组边:通常用E (Edge) 表示边的集合 边是顶点对:(v, w) ∈E ,其中v, w ∈ V 有向边<v, w> 表示从v指向w的边(单行线) 不考虑重边和自回路 无向图:边是无向边(v, w) 有向图:边是有向边<v, w> 连通:如果从V到W存在一条(无向)路径,则称V和W是连通的 连通图(Connected Graph):如果对于图的任一两个顶点v.w∈V,v和w都是连通的,则称

&lt;图论入门&gt;邻接矩阵+邻接表

非本人允许请勿转载. 趁热打铁,学会了邻接表把这个总结一下,以及感谢大佬uncle-lu!!!(奶一波)祝早日进队! 首先,图论入门就得是非常基础的东西,先考虑怎么把这个图读进去. 给定一个无向图,如下 怎么把这个图的数据读入进去呢? 把这个图剖析开来看,1连着的是2和3,2连着4和5,3连着6和7,4连着5,5连着8和6,6连着9. 所以这个图可以用一种神奇的东西----邻接矩阵来存.如下,能联通的制为1,不能联通的制为0. 那么可以看出来,这个邻接矩阵光读入的时间复杂度就是O(N2)的了,在

HDU 1285 确定比赛名次 拓扑排序(邻接矩阵 邻接表

确定比赛名次 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前.现在请你编程序确定排名. Input 输

【数据结构】邻接表的广度与深度遍历

邻接表:数组和链表相结合的方法.图中顶点一般用一个一维数组存储,也可以用单链表存储,每个顶点的邻接点构成一个线性表,一般为单链表. 无向图: 有向图: 代码: #include "stdio.h" #include "stdlib.h" #include "io.h" #include "math.h" #include "time.h" #define OK 1 #define ERROR 0 #defi

网络流三大算法【邻接矩阵+邻接表】POJ1273

网络流的基本概念跟算法原理我是在以下两篇博客里看懂的,写的非常好. http://www.cnblogs.com/ZJUT-jiangnan/p/3632525.html http://www.cnblogs.com/zsboy/archive/2013/01/27/2878810.html 网络流有四种算法, 包括 Edmond-Karp(简称EK), Ford-Fulkerson(简称FF), dinic算法以及SAP算法. 下面我会写出前三种算法的矩阵跟邻接表的形式, 对于第四种以后有必要

数据结构(11) -- 邻接表存储图的DFS和BFS

/////////////////////////////////////////////////////////////// //图的邻接表表示法以及DFS和BFS /////////////////////////////////////////////////////////////// #include <iostream> #include <stdlib.h> #include <queue> using namespace std; //图的邻接表表示法

数据结构----图(邻接表用法)

1.定义图的结构: 1 #define NUM_MAX 6 2 typedef struct ArcNode{ 3 int adjvex; 4 struct ArcNode * nextArc; 5 }ArcNode; //定义弧结点结构体 6 typedef struct VertexNode{ 7 int data; 8 ArcNode * firstArc; 9 }VertexNode;//定义顶点结构体 10 typedef struct { 11 VertexNode * AdjLis

《数据结构》C++代码 邻接表与邻接矩阵

       上一篇"BFS与DFS"写完,突然意识到这个可能偏离了"数据结构"的主题,所以回来介绍一下图的存储:邻接表和邻接矩阵.        存图有两种方式,邻接矩阵严格说就是一个bool型的二维数组,map[i][j]表示i到j有没有单向边,邻接表则是对1~N中每个点都拉出一个链表来,链表E[i]中存的每个点j都表示i到j有一条单向边. 这两种方式各有利弊,在稀疏图中,邻接表更好,省时间而且省空间:在稠密图中,邻接矩阵更好,不浪费时间的同时省去了指针域的空间