邻接表表示图

邻接表表示图是一种标准的做法,简单的做法是使用邻接矩阵,如下面的代码所示。

#include <iostream>
#include <string>
#include <map>
#include <queue>
#include <stack>
using namespace std;

struct edge {
	int value;
	size_t id;
	struct edge *next;
};

struct vertex {
	string name;
	size_t indegree, outdegree;
	struct edge *next;
};

struct graph {
	size_t n, m;
	struct vertex *v;
	map<string, size_t> h;
};

struct graph *create_graph(size_t n)
{
	struct graph *g = new struct graph;
	g->n = n;
	g->m = 0;
	g->v = new struct vertex[n];
	for (size_t i = 0; i < n; i++) {
		g->v[i].indegree = 0;
		g->v[i].outdegree = 0;
		g->v[i].next = 0;
	}
	return g;
}

void delete_graph(struct graph *g)
{
	for (size_t i = 0; i < g->n; i++) {
		struct edge *e = g->v[i].next;
		while (e) {
			struct edge *tmp = e->next;
			delete e;
			e = tmp;
		}
	}
	delete [] g->v;
	delete g;
}

size_t hash_graph(struct graph *g, string name)
{
	size_t n = g->h.size();
	if (g->h.find(name) == g->h.end()) {
		g->v[n].name = name;
		g->h[name] = n;
	}
	return g->h[name];
}

struct edge *adjacent_di_graph(struct graph *g, string a, string b, int v)
{
	size_t i = hash_graph(g, a);
	size_t j = hash_graph(g, b);
	struct edge *e = new struct edge;
	e->value = v;
	e->id = j;
	e->next = g->v[i].next;
	g->v[i].outdegree++;
	g->v[i].next = e;
	g->v[j].indegree++;
	g->m++;
	return e;
}

void adjacent_graph(struct graph *g, string a, string b, int v)
{
	adjacent_di_graph(g, a, b, v);
	adjacent_di_graph(g, b, a, v);
}

void print_graph(struct graph *g)
{
	cout << "graph : " << g->n << " vertexs, " <<
		g->m << " edges" << endl;
	for (size_t i = 0; i < g->n; i++) {
		struct edge *e = g->v[i].next;
		cout << g->v[i].name << "(" << g->v[i].indegree
			<< "," << g->v[i].outdegree << ") : ";
		while (e) {
			cout << g->v[e->id].name;
			if (e->next)
				cout << ",";
			e = e->next;
		}
		cout << endl;
	}
}

int main()
{
	struct graph *g = create_graph(7);
	adjacent_di_graph(g, "v1", "v2", 2);
	adjacent_di_graph(g, "v1", "v4", 1);
	adjacent_di_graph(g, "v2", "v4", 3);
	adjacent_di_graph(g, "v2", "v5", 10);
	adjacent_di_graph(g, "v3", "v1", 4);
	adjacent_di_graph(g, "v3", "v6", 5);
	adjacent_di_graph(g, "v4", "v3", 2);
	adjacent_di_graph(g, "v4", "v5", 2);
	adjacent_di_graph(g, "v4", "v6", 8);
	adjacent_di_graph(g, "v4", "v7", 4);
	adjacent_di_graph(g, "v5", "v7", 6);
	adjacent_di_graph(g, "v7", "v6", 1);
	print_graph(g);
	delete_graph(g);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值