邻接表表示图是一种标准的做法,简单的做法是使用邻接矩阵,如下面的代码所示。
#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;
}