图的应用

一、 实验目的
1.掌握图的存储思想及其存储实现。
2.掌握图的深度、广度优先遍历算法思想及其程序实现。
3. 掌握连通图的最小生成树和拓扑排序。
二、 实验内容及要求
(1) 键盘输入数据,分别建立一个有向图和一个无向图的邻接表。
(2) 输出该邻接表。
(3) 在有向图的邻接表的基础上计算各顶点的度,并输出。
(4) 采用邻接表存储实现无向图的深度优先遍历。
(5) 采用邻接表存储实现无向图的广度优先遍历。
(6) 在主函数中设计一个简单的菜单,分别调试上述算法。
(7) 以有向图的邻接表为基础输出它的拓扑排序序列。
(8) 以无向图的邻接矩阵为基础实现最小生成树的PRIM算法。
(9) 在主函数中设计一个简单的菜单,分别调试上述算法。
(10) 综合训练:校园导航
a)问题描述:
在给出校园各主要建筑的名称信息及有路线连通的建筑之间的距离(或行进时间)的基础上,利用校园导航系统计算出给定的起点到终点之间距离最近(或行进时间最短)的行进路线。
b设计要求:文件读入或键盘方式读入校园主要建筑信息及建筑间的距离(或行进时间)信息。创建完地图后,以文件形式保存,以免重复创建。计算出给定的起点到终点之间距离最近(或行进时间最短)的行进路线,并输出该路线(包括经过哪些建筑)及其总距离(或总行进时间)。
11)
综合训练
地下迷宫探索:假设有一个地下通道迷宫,它的通道都是直的,而通道所有交叉点(包括通道的端点)上都有一盏灯和一个开关。请问你如何从某个起点开始在迷宫中点亮所有的灯并回到起点?

输入格式:
输入第一行给出三个正整数,分别表示地下迷宫的节点数N(1<N≤1000,表示通道所有交叉点和端点)、边数M(M≤3000,表示通道数)和探索起始节点编号S(节点从1到N编号)。随后的M行对应M条边(通道),每行给出一对正整数,分别是该条边直接连通的两个节点的编号。
输出格式:
若可以点亮所有节点的灯,则输出从S开始并以S结束的包含所有节点的序列,序列中相邻的节点一定有边(通道);否则虽然不能点亮所有节点的灯,但还是输出点亮部分灯的节点序列,最后输出0,此时表示迷宫不是连通图。
由于深度优先遍历的节点序列是不唯一的,为了使得输出具有唯一的结果,我们约定以节点小编号优先的次序访问(点灯)。在点亮所有可以点亮的灯后,以原路返回的方式回到起点。

DS.h

#ifndef DACM_ZSN_DS_H
#define DACM_ZSN_DS_H
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;
#endif //DACM_ZSN_DS_H

ALGraph.h


#ifndef DACM_ZSN_ALGRAPH_H
#define DACM_ZSN_ALGRAPH_H

#include "DS.h"
#include "LinkQueue.h"

#ifndef ALGRAPH_H_INCLUDED
#define ALGRAPH_H_INCLUDED

#define N  10
typedef char VertexType;
typedef struct ArcNode {
    int adjvex;
    int weight;
    struct ArcNode *nextarc;
} ArcNode;

typedef struct VNode {
    VertexType data;
    ArcNode *firstarc;
} VNode, AdjList[N];
typedef struct {
    AdjList vertices;
    int vexnum, arcnum;
} ALGraph;

#endif // ALGRAPH_H_INCLUDED

int CreateUDG(ALGraph &G);

int CreateDG(ALGraph &G);

int CreateUDN(ALGraph &G);

int CreateDN(ALGraph &G);

int LocateVex(ALGraph G, char v);

int InsertList(ALGraph &G, int i, int j, int w);

void TraverseList(ALGraph G, int v);

int LengthList(ALGraph G, int v);

int FirstAdjVex(ALGraph G, int v);

int NextAdjVex(ALGraph G, int v, int w);

void DFSTraverse(ALGraph G);

void DFS(ALGraph G, int v);

void BFSTraverse(ALGraph G);

void BFS(ALGraph G, int v);

void CountNum(ALGraph G, int *ID);

#endif //DACM_ZSN_ALGRAPH_H

ALGraph.cpp

#include "ALGraph.h"


int visited[N];

Status InitLinkQueue(LinkQueue &LQ) {
    LQ.front = LQ.rear = (QueuePtr) malloc(sizeof(QNode));
    if (!LQ.front) exit(OVERFLOW);
    LQ.front->next = NULL;
    return OK;
}

Status EnLinkQueue(LinkQueue &LQ, QElemType e) {
    QueuePtr p;
    p = (QueuePtr) malloc(sizeof(QNode));
    if (!p) exit(OVERFLOW);
    p->data = e;
    p->next = NULL;
    LQ.rear->next = p;
    LQ.rear = p;
    return OK;
}

Status DeLinkQueue(LinkQueue &LQ, QElemType &e) {
    if (LQ.front == LQ.rear) return ERROR;
    QueuePtr p;
    p = LQ.front->next;
    e = p->data;
    LQ.front->next = p->next;
    if (LQ.rear == p)
        LQ.rear = LQ.front;
    free(p);
    return OK;
}

bool QueueEmpty(LinkQueue Q) {
    if (Q.front == Q.rear)
        return true;
    return false;
}

/*创建一个无向图的邻接表*/
int CreateUDG(ALGraph &G) {
    int m, n, k;
    char v1, v2;
    printf("请输入图G的顶点数和边数:");
    scanf("%d %d", &G.vexnum, &G.arcnum);
    printf("请输入%d个顶点名字(以空格区分):", G.vexnum);
    for (m = 0; m < G.vexnum; m++) {
        scanf(" %c", &G.vertices[m].data);  /*请注意输入格式*/
        G.vertices[m].firstarc = NULL; /*邻接表初始化为空*/
    }
    for (k = 1; k <= G.arcnum; k++) {
        printf("请输入第%d条边的两个顶点(以字符表示,字符间以空格区分):\n", k);
        scanf(" %c %c", &v1, &v2);  /*请注意输入格式*/
        m = LocateVex(G, v1);
        n = LocateVex(G, v2);
        InsertList(G, m, n, 0);   /*生成各自的邻接表*/
        InsertList(G, n, m, 0);
    }
    return OK;
}

/*请写出有向图的邻接表的生成函数*/
int CreateDG(ALGraph &G) {
    int m, n, k;
    char v1, v2;
    printf("请输入图G的顶点数和边数:");
    scanf("%d %d", &G.vexnum, &G.arcnum);
    printf("请输入%d个顶点名字(以空格区分):", G.vexnum);
    for (m = 0; m < G.vexnum; m++) {
        scanf(" %c", &G.vertices[m].data);  /*请注意输入格式*/
        G.vertices[m].firstarc = NULL; /*邻接表初始化为空*/
    }
    for (k = 1; k <= G.arcnum; k++) {
        printf("请输入第%d条边的两个顶点(以字符表示,字符间以空格区分,第一个为尾,第二个为头):\n", k);
        scanf(" %c %c", &v1, &v2);  /*请注意输入格式*/
        m = LocateVex(G, v1);       /*确定v1和v2的下标*/
        n = LocateVex(G, v2);
        InsertList(G, m, n, 0);   /*生成各自的邻接表*/
    }
    return OK;
}

/*请写出无向带权图的邻接表的生成函数*/
int CreateUDN(ALGraph &G) {
    int m, n, k, w;
    char v1, v2;
    printf("请输入图G的顶点数和边数:");
    scanf("%d %d", &G.vexnum, &G.arcnum);
    printf("请输入%d个顶点名字(以空格区分):", G.vexnum);
    for (m = 0; m < G.vexnum; m++) {
        scanf(" %c", &G.vertices[m].data);  /*请注意输入格式*/
        G.vertices[m].firstarc = NULL; /*邻接表初始化为空*/
    }
    for (k = 1; k <= G.arcnum; k++) {
        printf("请输入第%d条边的两个顶点和权值(以字符表示,字符间以空格区分):\n", k);
        scanf(" %c %c %d", &v1, &v2, &w);  /*请注意输入格式*/
        m = LocateVex(G, v1);       /*确定v1和v2的下标*/
        n = LocateVex(G, v2);
        InsertList(G, m, n, w);   /*生成各自的邻接表*/
        InsertList(G, n, m, w);
    }
    return OK;
}

/*请写出有向带权图的邻接表的生成函数*/
int CreateDN(ALGraph &G) {
    int m, n, k, w;
    char v1, v2;
    printf("请输入图G的顶点数和边数:");
    scanf("%d %d", &G.vexnum, &G.arcnum);
    printf("请输入%d个顶点名字(以空格区分):", G.vexnum);
    for (m = 0; m < G.vexnum; m++) {
        scanf(" %c", &G.vertices[m].data);  /*请注意输入格式*/
        G.vertices[m].firstarc = NULL; /*邻接表初始化为空*/
    }
    for (k = 1; k <= G.arcnum; k++) {
        printf("请输入第%d条边的两个顶点和权值(以字符表示,字符间以空格区分,第一个为尾,第二个为头):", k);
        scanf(" %c %c %d", &v1, &v2, &w);  /*请注意输入格式*/
        m = LocateVex(G, v1);       /*确定v1和v2的下标*/
        n = LocateVex(G, v2);
        InsertList(G, m, n, w);   /*生成各自的邻接表*/
    }
    return OK;
}

/*查找顶点v在邻接表存储法中的下标*/
int LocateVex(ALGraph G, char v) {
    int m;
    for (m = 0; m < G.vexnum; m++)
        if (G.vertices[m].data == v)
            return m;
    return ERROR;
}

/*在邻接表中插入顶点v的邻接点w*/

int InsertList(ALGraph &G, int m, int n, int w) {    // 给新加入的节点分配内存;
    ArcNode *p;
    p = (ArcNode *) malloc(sizeof(ArcNode));
    p->adjvex = n;
    p->weight = w;
    p->nextarc = G.vertices[m].firstarc;
    G.vertices[m].firstarc = p;
    return OK;
}


/*遍历顶点v的邻接表*/

void TraverseList(ALGraph G, int v) {
    ArcNode *p;
    int m;
    p = G.vertices[v].firstarc;
    while (p) {
        m = p->adjvex;
        printf(" --> %c ", G.vertices[m].data);
        p = p->nextarc;
    }
}

/*计算顶点v的邻接表长度*/

int LengthList(ALGraph G, int v) {
    ArcNode *p;
    int m = 0;
    if (G.vertices[v].firstarc == NULL) {
        return 0;
    }
    p = G.vertices[v].firstarc;
    m++;
    while (p->nextarc != NULL) {
        m++;
        p = p->nextarc;
    }
    return m;
}


/*深度优先遍历*/

void DFSTraverse(ALGraph G) {
    int m;
    for (m = 0; m < G.vexnum; m++)
        visited[m] = FALSE;
    for (m = 0; m < G.vexnum; m++)
        if (!visited[m]) DFS(G, m);
    printf("\n");
}

void DFS2(ALGraph G, int v) {
    int w;
    visited[v] = TRUE; /*访问顶点v, 并置访问标志数组相应分量值*/
    printf("%c ", G.vertices[v].data);
    for (w = FirstAdjVex(G, v); w >= 0; w = NextAdjVex(G, v, w))
        if (!visited[w]) DFS2(G, w);   /*递归调用DFS*/
} /*DFS*/
void DFS(ALGraph G, int v)
{
    ArcNode *p;
    visited[v] = TRUE;
    printf("%c  ", G.vertices[v].data);
    p = G.vertices[v].firstarc;
    while (p != NULL)
    {
        if (!visited[p->adjvex] )
        {
            DFS(G, p->adjvex);
        }
        //当递归找到出口时 此时就会运行到下面的语句 即一个结点的遍历走到了头
        //此时 再向后走  例如 第一条边的邻接表为 1 2 3  那么当2找到递归出口后
        //我们还要进行3的遍历  所以要有语句p=p->nextarc
        p = p->nextarc;
    }
}



/*在图G中查找顶点v的第一个邻接点*/

int FirstAdjVex(ALGraph G, int v) {
    if (G.vertices[v].firstarc)
        return G.vertices[v].firstarc->adjvex;  /*邻接表的第一个结点信息*/
    else
        return ERROR;
}


/*在图G中查找顶点v的邻接点w之后的下一个邻接点*/

int NextAdjVex(ALGraph G, int v, int w) {
    ArcNode *p;
    int m;
    p = G.vertices[v].firstarc;
    while (p) {
        if (p->nextarc == NULL) return ERROR;
        m = p->adjvex;
        if (m == w) {
            w = p->nextarc->adjvex;
            break;
        }
        p = p->nextarc;
    }
    return w;
}

void BFSTraverse(ALGraph G) {
    int m;
    for (m = 0; m < G.vexnum; m++)
        visited[m] = FALSE;
    for (m = 0; m < G.vexnum; m++)
        if (!visited[m]) BFS(G, m);
    printf("\n");
}

//BFSTraverse
void BFS(ALGraph G, int v) {
    QElemType e;
    ArcNode *p;
    LinkQueue q;
    InitLinkQueue(q);
    EnLinkQueue(q, v);
    visited[v] = TRUE;
    while (!QueueEmpty(q)) {
        DeLinkQueue(q, e);
        printf("%c ", G.vertices[e].data);
        p = G.vertices[e].firstarc;
        while (p) {
            if (!visited[p->adjvex]) {
                EnLinkQueue(q, p->adjvex);
                visited[p->adjvex] = TRUE;
            }
            p = p->nextarc;
        }
    }
}

/*计算有向图中各顶点的度*/

void CountNum(ALGraph G, int *ID) {
    ArcNode *p;
    int r[G.vexnum], c[G.vexnum];//c为出度,r为入度。
    for (int m = 0; m < G.vexnum; m++) {
        c[m] = LengthList(G, m);
    }
    for (int m = 0; m < G.vexnum; m++) {
        r[m] = 0;
    }
    for (int m = 0; m < G.vexnum; m++) {
        p = G.vertices[m].firstarc;
        while (p) {

            r[p->adjvex]++;

            p = p->nextarc;
        }
    }
    for (int m = 0; m < G.vexnum; m++) {
        ID[m] = c[m] + r[m];
    }
}

Main.cpp

#include "ALGraph.h"

int main() {

    while (TRUE) {
        ALGraph G;
        int i;
        int flag=0;
        printf("\t选择\n");
        printf("\t1.无向图\n");
        printf("\t2.有向图\n");
        printf("\t-1.退出\n");
        scanf("%d", &flag);
        switch (flag) {
            case 1:
                CreateUDG(G);
                printf("无向图的邻接表为:\n");
                break;
            case 2:
                CreateDG(G);
                printf("有向图的邻接表为:\n");
                break;
            case -1:
                system("pause");
                return 0;
        }
//    CreateDG(G);
        int Num[G.vexnum];
//    printf("无向图的邻接表为:\n");
        for (i = 0; i < G.vexnum; i++) {
//                printf("%c  ——>  ", G.vertices[i].data);
            printf("%c", G.vertices[i].data);
            TraverseList(G, i);
            printf("\n");
        }
        printf("DFS序列:");
        DFS(G, 0);
        printf("\n");
        DFSTraverse(G);
        printf("BFS序列:");
        BFSTraverse(G);
        printf("图中各顶点的度为:\n");
        CountNum(G, Num);
        for (i = 0; i < G.vexnum; i++) {
            if (flag == 1)
                printf("图中%d点的度为:%d\n", i + 1, Num[i] / 2);
            else
                printf("图中%d点的度为:%d\n", i + 1, Num[i]);
        }
    }
}

== 第二题 ==

AOV_DG.cpp

#include "graph.h"
#include<iostream>
#include<queue>
#include<cstring>
#include<stack>
using namespace std;


int LocateVNode(ALGraph g, int index) {
    int flag = 0;

    for (int i = 0; i < g.vNum; i++) {
        if (g.vertices[i].data==index) {
            flag = 1;
            return i;
        }
    }

//    if (flag == 0) {
//        return -1;//查找失败
//    }
    return -1;
}

int CreateUDG(ALGraph& g) {

    cin >> g.vNum >> g.arcNum;
    g.vertices = new VNode[g.vNum];

    for (int i = 0; i < g.vNum; i++) {
        cin >> g.vertices[i].data;
        g.vertices[i].firstArc = NULL;
    }

    for (int i = 0; i < g.arcNum; i++) {

        int v1, v2;
        cin >> v1 >> v2;
        v1 = LocateVNode(g, v1);
        v2 = LocateVNode(g, v2);

        ArcNode* p1 = new ArcNode;
        p1->adjvex = v2 + 1;
        p1->nextArc = g.vertices[v1].firstArc;
        g.vertices[v1].firstArc = p1;

        ArcNode* p2 = new ArcNode;
        p2->adjvex = v1 + 1;
        p2->nextArc = g.vertices[v2].firstArc;
        g.vertices[v2].firstArc = p2;

    }
    return 1;
}
int CreateDG(ALGraph& g) {

    cin >> g.vNum >> g.arcNum;
    g.vertices = new VNode[g.vNum];

    for (int i = 0; i < g.vNum; i++) {
        cin >> g.vertices[i].data;
        g.vertices[i].firstArc = NULL;
        g.vertices[i].inDegree = 0;
        g.vertices[i].outDegree = 0;
    }

    for (int i = 0; i < g.arcNum; i++) {

        int v1, v2;
        cin >> v1 >> v2;
        v1 = LocateVNode(g, v1);
        v2 = LocateVNode(g, v2);
        g.vertices[v2].inDegree++;
        g.vertices[v1].outDegree++;
        ArcNode* p1 = new ArcNode;
        p1->adjvex = v2 + 1;
        p1->nextArc = g.vertices[v1].firstArc;
        g.vertices[v1].firstArc = p1;


    }
    return 1;
}

void OutputDegree(ALGraph g) {

    for (int i = 0; i < g.vNum; i++) {

        cout << g.vertices[i].data << ":";
        cout << g.vertices[i].inDegree << " ";
        cout << g.vertices[i].outDegree << " ";
        cout << g.vertices[i].outDegree + g.vertices[i].inDegree << "\n";

    }
}

void OutputDGraph(ALGraph g) {

    for (int i = 0; i < g.vNum; i++) {

        cout << g.vertices[i].data << ":";
        ArcNode* p = g.vertices[i].firstArc;
        while (p) {
            cout << p->adjvex << " ";
            p = p->nextArc;
        }
        cout << endl;

    }

}

void WidthTraverseGraph(ALGraph g) {

    queue<int> TraverseList;
    int visited[1000];
    memset(visited, 0, sizeof(visited));

    cout << "v" << g.vertices->data << " ";
    visited[0] = true;
    TraverseList.push(g.vertices->data);

    while (!TraverseList.empty()) {

        int u = TraverseList.front();
        TraverseList.pop();

        ArcNode* p = g.vertices[LocateVNode(g,u)].firstArc;

        while (p != NULL) {
            if (!visited[LocateVNode(g, p->adjvex)]) {

                cout << "v" << p->adjvex << " ";
                visited[LocateVNode(g, p->adjvex)] = true;
                TraverseList.push(p->adjvex);

            }
            p = p->nextArc;
        }
    }
}
int visited[1000];


void DepthTraverseGraph(ALGraph g) {

    memset(visited, 0, sizeof(visited));
    for (int i = 0; i < g.vNum; i++) {
        if (visited[i] == 0) {
            Depth_TG(g, i);
        }
    }

}

void Depth_TG(ALGraph g,int v) {
    cout << g.vertices[v].data << " ";
    visited[v] = true;
    ArcNode* p = g.vertices[v].firstArc;
    while (p) {
        int w = LocateVNode(g, p->adjvex);
        if (!visited[w]) {
            Depth_TG(g, w);
        }
        p = p->nextArc;
    }
}

int AOVSort(ALGraph g) {

    stack<int> s;
    for (int i = 0; i < g.vNum; i++) {
        if (g.vertices[i].inDegree == 0) {
            s.push(i);
        }
    }

    int m = 0;//计数
    queue<int> q;
    while (!s.empty()) {
        int temp = s.top();
        s.pop();
        q.push(temp + 1);
        m++;
        ArcNode* p = g.vertices[temp].firstArc;
        while (p) {

            int a = p->adjvex;
            g.vertices[LocateVNode(g,a)].inDegree--;
            if (g.vertices[LocateVNode(g, a)].inDegree == 0) {
                s.push(LocateVNode(g, a));
            }
            p = p->nextArc;
        }
    }
    if (m < g.vNum) {
        return -1;
    }
    else {
        while (!q.empty()) {
            cout << "v" << q.front() << " ";
            q.pop();
        }
        return 1;
    }
}

graph.h

//
// Created by AdministratorYWJ on 2022/5/6.
//

#ifndef DACM_ZSN_GRAPH_H
#define DACM_ZSN_GRAPH_H
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#define NOTEXIST -1
#define BEGIN -1
#define MAXVEX 100
#define INFINITY 65535
#define TRUE 1
#define FALSE 0
typedef int EdgeType;
typedef char VertexType;
int dist[MAXVEX];  //dist指 从 该点到被收录的各点中 距离的最小值
typedef struct Graph {
    VertexType vex[MAXVEX];
    EdgeType edge[MAXVEX][MAXVEX];
    int vex_num, edge_num;
}Graph;
char read_char();
int get_pos(Graph g,char ch);
void create_graph(Graph *g);
void Prim(Graph g,int start);
void print_graph(Graph g);




typedef struct ArcNode {

    int adjvex;
    struct ArcNode* nextArc;

}ArcNode;    //边节点

typedef struct VNode {

    int data;
    int inDegree, outDegree;
    ArcNode* firstArc;

}VNode, * AdjList;

typedef struct {

    int vNum, arcNum;
    AdjList vertices;

}ALGraph;
int LocateVNode(ALGraph g, int index);
int CreateUDG(ALGraph& g);
int CreateDG(ALGraph& g);
void OutputDegree(ALGraph g);
void OutputDGraph(ALGraph g);
void WidthTraverseGraph(ALGraph g);
void Depth_TG(ALGraph g, int v);
int AOVSort(ALGraph g);

#endif //DACM_ZSN_GRAPH_H

Matrix_Prim.cpp

//
// Created by AdministratorYWJ on 2022/5/6.
//
#include "graph.h"
char read_char()
{
    char ch;
    do {
        ch = getchar();
    } while (!isalpha(ch));
    return ch;
}
//get位置
int get_pos(Graph g, char ch)
{
    int i;
    for (i = 0; i < g.vex_num; i++) {
        if (g.vex[i] == ch)
            return i;
    }
    return -1;
}
//创建图
void create_graph(Graph *g)
{
    int i, j, k;
    printf("请输入顶点数与边数:\n");
    scanf("%d%d", &g->vex_num, &g->edge_num);
    //处理边的权重,0或无穷大
    for (i = 0; i < g->vex_num; i++) {
        for (j = 0; j < g->vex_num; j++) {
            if (i == j) {
                g->edge[i][j] = 0;
            }
            else
                g->edge[i][j] = INFINITY;
        }
    }
    printf("请输入顶点信息:\n");
    for (i = 0; i < g->vex_num; i++) {
        g->vex[i] = read_char();
    }
    printf("请输入边的信息:\n");
    char c1, c2;
    int p1, p2, w;
    for (k = 0; k < g->edge_num; k++) {
        c1 = read_char();
        c2 = read_char();
        scanf("%d", &w);//权重,可以不选
        p1 = get_pos(*g, c1);
        p2 = get_pos(*g, c2);
        g->edge[p1][p2] = w;//有向边的权重
        g->edge[p2][p1] = w;
    }
}

void Prim(Graph g, int start)
{
    int sum = 0;
    int index = 0;
    int i, j;
    char prims[MAXVEX];
    prims[index++] = g.vex[start];

    for(i = 0; i < g.vex_num; i++ ){
        dist[i] = g.edge[start][i];
    }
    dist[start] = 0; //需要
    int min, u, v;
    int pre;
    for(i = 0; i < g.vex_num; i++ ){
        if(start == i)
            continue;
        min = INFINITY;
        for(j = 0; j < g.vex_num; j++ ){
            if(dist[j] != 0 && dist[j] < min){
                min = dist[j];
                u = j;
            }
        }
        if(dist[u] != 0)// not really needed anymore.
            prims[index++] = g.vex[u];
        dist[u]    = 0;
        for(v = 0; v < g.vex_num; v++ ){
            if(dist[v] != 0 && g.edge[u][v] < dist[v])
                dist[v] = g.edge[u][v];
        }
    }
    for(i = 1; i < g.vex_num; i++){
        min = INFINITY;//可以排除u v两点不存在边的情况
        v = get_pos(g, prims[i]);
        for(j = 0; j < i; j++ ){
            u = get_pos(g, prims[j]);
            if(g.edge[u][v] < min){
                min = g.edge[u][v];
            }
        }
        sum += min;
    }

    printf("prim %c = %d\n",g.vex[start],sum);
    for(i = 0; i < index; i++ ){
        printf("%c ",prims[i]);
    }
}

void print_graph(Graph g)
{
    int i, j;
    for (i = 0; i < g.vex_num; i++) {
        for (j = 0; j < g.vex_num; j++) {
            if (g.edge[i][j] == INFINITY)
                printf("%5c", '*');
            else {
                printf("%5d", g.edge[i][j]);
            }
        }
        printf("\n");
    }
}

Main.cpp

//
// Created by AdministratorYWJ on 2022/5/6.
//
#include "graph.h"
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<iostream>
#include<queue>
#include<cstring>
#include<stack>

void menu(){
    int choice;
    printf("\t选择\n");
    scanf("%d",&choice);
    switch (choice) {
        case 1:
            printf("1.以有向图的邻接表为基础输出它的拓扑排序序列\n");
            ALGraph g1;
            CreateDG(g1);//创建有向图
            AOVSort(g1);//拓扑排序
            break;
        case 2:
            printf("2.以无向图的邻接矩阵为基础实现最小生成树的PRIM算法\n");
            Graph g2;
            int start, end;
            char c1;
            create_graph(&g2);
            printf("请输入起始点:\n");
            c1 = read_char();
            start = get_pos(g2, c1);
            Prim(g2, start);
            getchar();
            break;
        case -1:
            system("pause");
            return;

    }
}
int main(){
    while (1){
        menu();
        return 0;
    }
}
posted @ 2022-06-30 14:09  WEIWEI1095  阅读(91)  评论(0)    收藏  举报
*/
作品集 //