图0000

#include
using namespace std;
#define MaxInt 32767
#define MVNum 100
typedef char VerTexType;
typedef int ArcType;
//邻接矩阵的储存表示 用两个数组分别储存顶点表(一维数组)和邻接矩阵(二维数组)
typedef struct {
    VerTexType vexs[MVNum];//顶点表
    ArcType arcs[MVNum][MVNum];//邻接矩阵
    int vexnum;//图的当前点数
    int arcnum;//图的当前边数
}AMGraph;

//创建无向网算法(求无向图的算法只需把该算法边的权值初始化为0,,其次是在构造邻接矩阵时,将权值w改为1即可) 1. 输入总顶点数 和总边数
//2.依次输入点的信息存入顶点表中
//3.初始化邻接矩阵,使每个权值的初始化为极大值
//4.构造邻接矩阵,依次输入每条吧依附顶点和其权值
int LocateVex(AMGraph G,VerTexType u){
    int i;
    for (i = 0; i < G.vexnum; i++) {
        if (G.vexs[i] == u) {
            return i;
        }
    }
    return -1;
}
int CreatUDN(AMGraph& G) {
    int i, j, k;
    cin >> G.vexnum >> G.arcnum;//输入总顶点数,总边数
    for (i = 0; i < G.vexnum; i++) {
        cin >> G.vexs[i];
    }
    for (i = 0; i < G.vexnum; i++) {
        for (j = 0; j < G.vexnum; j++) {
            G.arcs[i][j] = MaxInt;//每个值都先置为最大值
         }
    }
    
    //构造邻接矩阵
    int v1, v2, w;
    for (k = 0; k < G.arcnum; k++) {
        cin >> v1 >> v2 >> w;
        i = LocateVex(G, v1);
        j = LocateVex(G, v2);
        G.arcs[i][j] = w;
        G.arcs[j][i] = w;
    }
}
int main() {
    return 0;
}

#include
using namespace std;
typedef char VerTexType;
//邻接表(链式)
//在邻接表中,对图中每个顶点v建立一个单链表,把与v相邻接的顶点放在这个链表中
//邻接表中每个单链表的第一个结点存放有关顶点的信息,把这个节点看成链表的表头,其余结点存放有关边的信息,这样邻接表便由两部分组成:表头结点表和边表
//表头结点包括数据域和链域
//边表包括链接点域(链接点域)和链域(与v链接的下一条边的结点)
//若无向图有n个顶点,e条边
//则其邻接表需要n个头结点和2e个表节点
//所以无向图邻接表需要O(n+2e)的储存空间,适合储存稀疏图


//有向图的邻接表
//只需要保存以当前顶点为弧尾的这一条边(每条弧只保存一次,只保存发出的弧)
//没有发出弧的顶点的表头节点的链域就置为NULL
//逆邻接表 既然可以用每个结点来储存点的出度边,那么当然也能反过来存入度的边
//在逆邻接表中,单链表当中的结点是入度边

#define MVNum 100
typedef struct ArcNode {//边节点的定义
    int adjvex;//指向相邻的邻界点位置的下标
    struct ArcNode* nextarc;
    //OtherInfo info;和边相关的信息 如:权值
}ArcNode;
typedef struct VNode {
    //表头顶点的结果包含两个成员
    VerTexType data;//顶点的数据域,用来储存顶点的信息
    ArcNode* firstarc;//指向边节点的指针
}VNode,AdjList[MVNum];
//图的结果定义
typedef struct {
    AdjList vertices;//邻接表类型的数组,储存所有的表头顶点
    int vexnum;//图当前顶点数
    int arcnum;//图当前弧数
}ALGraph;
int LocateVex(ALGraph& G, int v) {
    for (int i = 0; i < G.vexnum; i++) {
        if (G.vertices[i].data == v)
            return i;
    }
    return -1;
}
int CreateUDG(ALGraph& G) {
    cin >> G.vexnum >> G.arcnum;//输入总顶点数,总边数

    for (int i = 0; i < G.vexnum; i++) {//输入各顶点,构造表头节点
        cin >> G.vertices[i].data;
        G.vertices[i].firstarc = NULL;//初始化表头结点的指针域为NULL
    }

    for (int k = 0; k < G.arcnum; k++) {//输入各边,构造邻接表,数组中有几个顶点就循环多少次
        int v1, v2;
        cin >> v1 >> v2;//输入一条边连接的两个顶点
        int i = LocateVex(G, v1);
        int j = LocateVex(G, v2);
        ArcNode* p = new ArcNode;
        p->adjvex = j;
        p->nextarc = G.vertices[i].firstarc;
        G.vertices[i].firstarc = p;
        ArcNode* p1 = new ArcNode;
        p1->adjvex = i;
        p1->nextarc = G.vertices[j].firstarc;
        G.vertices[j].firstarc = p1;
    }
    return 1;
}
int main() {
    return 0;
}

//十字链表 是有向图的另一种链式储存结构,可以看成是将有向图的邻接表以及逆邻接表结合起来的到的一种新的链表
//有向图的每个顶点在十字链表中对应有一个结点,叫顶点结点,用来存放原来的第一个出,入度边。
//有向图中的每一条弧对应十字链表中的一个弧结点
//顶点结点的第二个元素指向该顶点的入度弧,第三个元素指向该顶点的出度弧
//因此顶点结点的第二个元素会指向箭头指向该顶点的那条弧,第三个元素会指向来自顶点的那条弧

//弧结点:第一个元素代表这个弧来自哪个顶点 
        //第二个元素代表这条弧指向哪个顶点
       //第三个元素指向下一个指向同一个顶点的弧
       //第四个元素指向下一条同一个顶点出发的弧

你可能感兴趣的:(算法,图论)