#include <iostream>
#include <queue>
using namespace std;
bool Visited[100] = { false };
#define MaxVertexNum 100/*最大顶点数设为100*/
typedef int Vertex;/*用顶点下标表示顶点,为整形*/
typedef int WeightType;/*边的权值设为整型*/
typedef char DataType;/*顶点存储的数据类型设为字符型*/
/*边的定义*/
typedef struct ENode* PtrToENode;
struct ENode {
Vertex v1, v2;/*有向边<v1,v2>*/
WeightType Weight;//权重
};
typedef PtrToENode Edge;
//邻接点的定义
typedef struct AdjVNode* PtrToAdjVNode;
struct AdjVNode {
Vertex AdjV;//邻接点下标
WeightType Weight;//边权重
PtrToAdjVNode Next;//指向下一个邻接点的指针
};
//顶点表头结点的定义
typedef struct VNode {
PtrToAdjVNode FirstEdge;//边表头指针
DataType Data;//存顶点的数据
}AdjList[MaxVertexNum];//AdjList是邻接表类型
//图结点的定义
typedef struct GNode* PtrToGNode;
struct GNode {
int Nv;//顶点数
int Ne;//边数
AdjList G;//邻接表
};
typedef PtrToGNode LGraph;//以邻接表方式存储的图类型
LGraph CreateGragp(int VertexNum) {
//初始化一个有VertexNum个顶点但没有边的图
Vertex V;
LGraph Graph;
Graph = (LGraph)malloc(sizeof(struct GNode));//建立图
Graph->Nv = VertexNum;
Graph->Ne = 0;
//初始化邻接表头指针
for (V = 0; V < Graph->Nv; V++) {
Graph->G[V].FirstEdge = NULL;
}
return Graph;
}
void InsertEdge(LGraph Graph, Edge E) {
PtrToAdjVNode NewNode;
//插入边<v1,v2>
//为v2建立新的邻接点
NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
NewNode->AdjV = E->v2;
NewNode->Weight = E->Weight;
//将v2插入v1的表头
NewNode->Next = Graph->G[E->v1].FirstEdge;
Graph->G[E->v1].FirstEdge = NewNode;
//若是无向图 还要插入边<v2,v1>
//为v1建立新的邻接点
NewNode = (PtrToAdjVNode)malloc(sizeof(struct AdjVNode));
NewNode->AdjV = E->v1;
NewNode->Weight = E->Weight;
//将v1插入v2的表头
NewNode->Next = Graph->G[E->v2].FirstEdge;
Graph->G[E->v2].FirstEdge = NewNode;
}
LGraph BuildGrapg()
{
LGraph Graph;
Edge E;
Vertex V;
int Nv, i;
cin >> Nv;
Graph = CreateGragp(Nv);
cin >> Graph->Ne;
if (Graph->Ne != 0) {
E = (Edge)malloc(sizeof(struct ENode));
for (i = 0; i < Graph->Ne; i++) {
cin >> E->v1 >> E->v2 >> E->Weight;
InsertEdge(Graph, E);
}
}
//如果顶点有数据 读入数据
for (V = 0; V < Graph->Nv; V++) {
cin >> Graph->G[V].Data;
}
return Graph;
}
void Visit(Vertex v) {
printf("正在访问%d\n", v);
}
void Dfs(LGraph Graph, Vertex v, void (*Visit)(Vertex)) {
//以v为出发点对邻接表存储的图Graph进行DFS搜索
PtrToAdjVNode W;
Visit(v);//访问第v个顶点
Visited[v] = true;//标记已访问
for (W = Graph->G[v].FirstEdge; W; W = W->Next) {
if (!Visited[W->AdjV])Dfs(Graph, W->AdjV, Visit);
}
}
//无权图的单源最短路算法 邻接表存储
/*dist[]和path[]全部初始化为-1*/
int dist[100], paht[100];
void Unweighted(LGraph Graph, int dist[], int path[], Vertex s) {
for (int i = 0; i < 100; i++) {
dist[i] = -1;
path[i] = -1;
}
queue<int>q;
Vertex v;
PtrToAdjVNode w;
dist[s]= 0;
q.push(s);
while (!q.empty()) {
v = q.front();
q.pop();
for (w = Graph->G[v].FirstEdge; w; w = w->Next) {
if (dist[w->AdjV] == -1) {
dist[w->AdjV] = dist[v] + 1;
path[w->AdjV] = v;
q.push(w->AdjV);
}
}
}
}
邻接表c++实现及无权图的单源最短算法
最新推荐文章于 2024-05-01 08:01:49 发布