1.邻接矩阵实现
/*
对于无向图可以用(n+1)n/2 的 以为数组存储以节省空间,Gij对应下标为
(i*(i+1)/2+j)
*/
#define MaxVertexNum 100 // 最大顶点数设为100
#define INFINITY 65535 // ∞设为双字节无符号整数的最大值65535
typedef char VertexType; // 顶点类型设为字符型
typedef int EdgeType; // 边的权值设为整型
enum GraphType { DG, UG, DN, UN };
// 有向图,无向图,有向网图,无向网图
typedef struct{
VertexType Vertices[MaxVertexNum]; // 顶点表
EdgeType Edges[MaxVertexNum][MaxVertexNum];// 邻接矩阵,即边表
int n, e; // 顶点数n和边数
enum GraphType GType; // 图的类型分4种:UG、DG、UN、DN
}MGraph;
void CreateMGraph(MGraph *G)
{
int i, j, k, w;
G-> GType = UN; // Undirected Network 无向网图
printf( "请输入顶点数和边数(输入格式为:顶点数, 边数):\n" );
scanf("%d, %d",&(G->n), &(G->e));
printf("请输入顶点信息(输入格式为:顶点号<CR>):\n");
for(i = 0; i < G->n; i++)
scanf( "%c",&(G-> Vertices[i]) );
for(i = 0; i < G->n; i++)
for(j = 0; j < G->n; j++)
G->Edges[i][j] = INFINITY;
printf( "请输入每条边对应的两个顶点的序号和权值,输入格式为:i, j, w:\n" );
for (k = 0; k < G->e; k++)
{
scanf("%d,%d,%d ",&i, &j, &w); // 输入e条边上的权,建立邻接矩阵
G->Edges[i][j] = w;
G->Edges[j][i] = w; // 因为无向网图的邻接矩阵是对称的
}
}
2.邻接表实现
#define MaxVertexNum 100 // 最大顶点数为100
enum GraphType{ DG, UG, DN, UN };// 有向图,无向图,有向网图,无向网图
typedef struct node{ // 边表结点
int AdjV; // 邻接点域
struct node *Next; // 指向下一个邻接点的指针域
// 若要表示边上的权值信息,则应增加一个数据域Weight
}EdgeNode;
typedef char VertexType; // 顶点用字符表示
typedef struct Vnode{ // 顶点表结点
VertexType Vertex; // 顶点域
EdgeNode *FirstEdge; // 边表头指针
}VertexNode;
typedef VertexNode AdjList[ MaxVertexNum ]; // AdjList是邻接表类型
typedef struct{
AdjList adjlist; // 邻接表
int n, e; // 顶点数和边数
enum GraphType GType; // 图的类型分4种:UG、DG、UN、DN
}ALGraph;
void CreateALGraph(ALGraph *G)
{
int i, j, k;
EdgeNode *edge;
G-> GType = DG; // Directed Graph 有向图
printf("请输入顶点数和边数(输入格式为:顶点数,边数):\n");
scanf("%d,%d", &(G->n), &(G->e));
printf("请输入顶点信息(输入格式为:顶点号<CR>):\n");
for ( i=0; i < G->n; i++ )
{ // 建立有n个顶点的顶点表
scanf( " %c", &(G->adjlist[i].Vertex) ); // 读入顶点信息
G->adjlist[i].FirstEdge = NULL; // 顶点的边表头指针设为空
}
printf("请输入边的信息(输入格式为: i, j <CR>):\n");
for(k=0; k < G->e; k++ )
{ // 建立边表
scanf( "\n%d,%d", &i, &j); // 读入边<vi,vj>的顶点对应序号
edge = (EdgeNode*)malloc(sizeof(EdgeNode));
// 生成新边结点edge
edge->AdjV = j; // 邻接点序号为j
edge->Next = G->adjlist[i].FirstEdge;
// 将新边表结点edge插入到顶点vi的边表头部
G->adjlist[i].FirstEdge = edge;
// 若是无向图,还要生成一个结点,用来表示边< vj, vi>
}
}
3.深度优先搜索(DFS)
//邻接矩阵o(N^2)
//邻接表 O(N+E)
// 定义一个visited的数组保存每个结点,访问过为true,没有访问则false,下面是伪代码
void DFS(Vertex V)
{
visited[V] = true;
for( V 的每一个邻接点 W )
{
if(!visited[W])
DFS(W);
}
}
4.广度优先搜索(BFS)
//邻接矩阵o(N^2)
//邻接表 O(N+E)
/*
定义一个visited的数组保存每个结点,访问过为true,没有访问则false,定义一个队列含ADD和DELET方法,下面是伪代码
*/
void BFS(Vertex V)
{
visited[V] = true;
Addqueue(V, Q);
while(!Isempty(Q))
{
V = Dequeue(Q);
for( V的每个邻接点W )
{
if(!visited[w])
{
visited[w] = true;
Addqueue(W, Q);
}
}
}
5.求图中的连通分量:
//伪代码
int connect = 0;
void ListComponents(Graph G)
{
for(G中的而每一个V)
{
if(!visited[V])
{
DFS(V)/BFS(V);
connect++;
}
}
}