图论常用的构图方法

原创 2012年03月28日 13:42:40


一、最常用的邻接图(最简单的构图方法)

用一个二维数组表示节点i到j的路径长度,可以初始化为-1,来表示不存在i到j的路径

这种方法的缺点在于占用空间较大,在用边频繁的时候不方便,代码如下

#define Max_Node_Num 1000
int graph[Max_Node_Num][Max_Node_Num];
int node_num,edge_num;
void build_graph()
{
	//初始化,使用-1来表示不存在边
	memset(graph,0xff,sizeof(graph));
	//输入节点数及边数
	scanf("%d%d",&node_num,&edge_num);
	//输入边,构造图
	int from,to,value;
	for (int i = 0;i < edge_num;i++){
		scanf("%d%d%d",&from,&to,&value);
		graph[from][to] = value;
	}
}

二、用指针实现的邻接表

#define Max_Node_Num 1000
struct Edge
{
	int des;
	int value;
	Edge * next;
	Edge(){
		des = value = 0;
		next = NULL;
	}
	Edge(int a,int b,Edge * n){
		des = a;
		value = b;
		next = n;
	}
};
//每个节点保存一个链表,记录从这个节点出去的边
Edge * nodes[Max_Node_Num];
int node_num,edge_num;
void build_graph(){
	//输入节点数,边数
	scanf("%d%d",&node_num,&edge_num);
	//初始化
	for (int i = 0;i < node_num;i++)
		nodes[i] = NULL;
	int from,to,value;
	for (int i = 0;i < edge_num;i++){
		scanf("%d%d%d",&from,&to,&value);
		//把from节点的队列放入next
		Edge *e = new Edge(to,value,nodes[from]);
		//将节点变成链表头
		nodes[from] = e;
	}
}

三、用vector实现的邻接表

#define Max_Node_Num 1000
struct Edge{
	int des;
	int value;
	Edge(){
		des = value = 0;
	}
	Edge(int a,int b){
		des = a;
		value = b;
	}		
};
vector<Edge> nodes[Max_Node_Num]; 
int node_num,edge_num;
//有向图构图
void build_graph(){
	//输入节点数,边数
	scanf("%d%d",&node_num,&edge_num);
	//初始化
	for (int i = 0;i < node_num;i++)
		nodes[i].clear();
	int from,to,value;
	//输入每条边信息
	for (int i = 0;i < edge_num;i++){
		scanf("%d%d",&from,&to,&value);
		nodes[from].push_back(Edge(to,value));
	}
}

四、用数组实现的邻接表

#include <iostream>
using namespace std;
#define Max_Node_Num 1000
#define Max_Edge_Num 1000000
struct Edge{
	int des;
	int value;
	int next;
};
//记录每条边的信息
Edge edges[Max_Edge_Num];
//用数组记录节点最后加入的边的编号
int nodes[Max_Node_Num];
int node_num,edge_num;
void build_graph(){
	scanf("%d%d",&node_num,&edge_num);
	//初始化节点,初始化为-1,即表示没有从此节点出的边
	memset(nodes,0xff,sizeof(nodes));
	int from,to,value;
	for (int i = 0;i < edge_num;i++){
		scanf("%d%d%d",&from,&to,&value);
		edges[i].des = to;
		edges[i].value = value;
		//将此边的下一条边记录为from节点此前最后加入的边
		edges[i].next = nodes[from];
		//在nodes数组中记录从from节点出的最后一条边的编号
		nodes[from] = i;
	}
}

此种方法遍历一个节点出去的所有边的方法如下:
for(i=p[u];i!=-1;i=edg[i].next)

完!

最后一种方法在遍历所有边上有优势,vector使用方便





【数模集】 图论常用算法 基础

图与网络优化概述          图论中所谓的“图”是指某类具体事物和这些事物之间的联系。如果我们用点表示这些具体事物,用连接两点的线段(直的或曲的)表示两个事物的特定的联系,就得到了描述这个“图”...
  • wyh7280
  • wyh7280
  • 2015年08月10日 01:12
  • 1076

图论算法

图的定义 背景知识 看到这篇博客相信一开始映入读者眼帘的就是下面这幅图了,这就是传说中的七桥问题(哥尼斯堡桥问题)。在哥尼斯堡,普雷格尔河环绕着奈佛夫岛(图中的A岛)。这条河将陆地分成了下...
  • gdut2015go
  • gdut2015go
  • 2015年06月18日 15:36
  • 6137

数模常用方法介绍和图论算法的matlab实现 很不错的

  • 2010年06月06日 20:58
  • 521KB
  • 下载

三种常用构图方式

这篇博客讲的不是按像素计算的图片或者摄影摄像的构图,而是节点与节点之间有边、边上有权值的图,如何把这样的一张图存入计算机中。这里将介绍三种较为常用的构图方式:邻接矩阵、vector 数组和链式前向星构...
  • CSDNjiangshan
  • CSDNjiangshan
  • 2017年07月20日 12:01
  • 267

图论----同构图

图论当中的术语,假设G=(V,E)和G1=(V1,E1)是两个图,如果存在一个双射m:V→V1,使得对所有的x,y∈V均有xy∈E等价于m(x)m(y)∈E1,则称G和G1是同构的,这样的一个映射m称...
  • hy1405430407
  • hy1405430407
  • 2015年08月18日 10:38
  • 4957

图论基础

图论及搜索方法 http://www.cnblogs.com/touchsunlight/archive/2010/08/04/1792557.html最小生成shu树(Prim算法和Kruskal算...
  • woshilixuhang
  • woshilixuhang
  • 2013年09月26日 10:57
  • 807

acm图论基本概念和常用算法归纳比较

  • 2013年10月23日 14:17
  • 5.51MB
  • 下载

黄金分割与构图

黄金分割与构图
  • qwertyupoiuytr
  • qwertyupoiuytr
  • 2017年01月04日 00:12
  • 872

篆刻章法(一)

篆刻章法,亦称构图,或叫分朱布白,这就是将单个字或一组字在方寸大小的印面上排列、安排的方法,是一门比较复杂而极为灵活的学问。章法构图随型布局,千变万化。印面内容安排得当与否,直接影响着艺术效果,是篆刻...
  • chindroid
  • chindroid
  • 2012年07月17日 16:33
  • 2565

图论基础

图概述 图(Graph)是一种比线性结构和树形结构都要复杂的数据结构。简单讲,图是由表示数据元素的的集合V和表示数据之间关系的集合E组成。其中,数据元素常称作顶点(vertex),数据之间的关系常称...
  • zhangxiangDavaid
  • zhangxiangDavaid
  • 2014年07月18日 00:20
  • 4054
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:图论常用的构图方法
举报原因:
原因补充:

(最多只允许输入30个字)