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++;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值