【图论基础】 图的表示(邻接矩阵、邻接表、链式前向星)

【图论基础】 图的表示

邻接矩阵

#define DATASIZE 1e3

int map[DATASIZE][DATASIZE];

memset(map,0,sizeof(map));   //初始化

for(int i=0;i<m;i++)
{
	int u,v;
	scanf("%d%d",&u,&v);		//读入每条边。有边为1 无边为0
	map[u][v] = 1;
	map[v][u] = 1;
}

//遍历每条边
for(int i=0;i<n;i++)
{	
	if(map[u][i])
	{	
		int v = i;
	}
}

邻接表

#define DATASIZE 1e3

struct edge			//定义边  w表示权值   v表示连接的点
{
	int v,w;
	edge(){}
	edge(int _v,int _w):v(_v),w(_w){}
};

std::vector<edge> G[DATASIZE];

// 输入
for(int i=0;i<n;i++)
{	
	int u,v,w;
	scanf("%d%d%d",&u,&v,&w);
	G[u].emplace_back(v,w);
	G[v].emplace_back(u,w);
}

// 遍历
for(size_t i=0;i<G[u].size();i++)
{
	edge e = G[u][i];
}

链式前向星

#define DATASIZE 1e3

struct edge
{
	int to;			// 当前u对应的v,也就是下一条边next的起点
	int next;		// 要遍历的下一条边的id
	int cost; 		// 边权
}e[DATASIZE];
int head[DATASIZE];

// 初始化
memset(head,-1,sizeof(head));

// 输入
inline void add(int u,int v,int w)
{
	e[id].to = v;
	e[id].next = head[u];
	e[id].cost = w;
	head[u] = id++;
}

for(int i=0;i<m;i++)
{
	int u,v,w;
	scanf("%d%d%d",&u,&v,&w);
	add(u,v,w);
	add(v,u,w);		// 无向图,双向加边
}

// 遍历
for(int i=head[u];~i;i=e[i].next)    // ~(-1) == 0  else bool (~i) == true
{
	int v = e[i].to;
}

猜你喜欢

转载自blog.csdn.net/qq_30445397/article/details/107593947