标签:bsp parent ted oid lis 长度 null 优先 int
邻接矩阵类型声明
typedef struct {
int number;
InfoType info;
}VertexType;
typedef struct {
int edges[MAXV][MAXV];
int n, e;
VertexType vexs[MAXV]; //存放顶点信息
}MatGraph;
邻接表类型声明
typedef struct ANode{
int adjvex;
struct ANode* nextarc;
int weight;
}ArcNode;
typedef struct {
InfoType info;
ArcNode* firstarc;
}VNode;
typedef struct {
VNode adjlist[MAXV];
int n, e;
}AdjGraph;
创建图
void CreateAdj(AdjGraph*& G, int A[MAXV][MAXV], int n, int e)
{
int i, j;
ArcNode* p;
G = (AdjGraph*)malloc(sizeof(AdjGraph));
for (i = 0; i < n; i++)
G->adjlist[i].firstarc = NULL;
for (i = 0; i < n; i++)
{
for (j = n - 1; j >= 0; j--)
{
if (A[i][j] != 0 && A[i][j] != INF)
{
p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = j;
p->weight = A[i][j];
p->nextarc = G->adjlist[i].firstarc;
G->adjlist[i].firstarc = p;
}
}
}
G->n = n;
G->e = e;
}
输出图
void DispAduj(AdjGraph* G)
{
ArcNode* p;
int i;
for (i = 0; i < G->n; i++)
{
//p = (ArcNode*)malloc(sizeof(ArcNode));
p = G->adjlist[i].firstarc;
printf("%3d: ", i);
while (p != NULL)
{
printf("%3d[%d]->", p->adjvex, p->weight);
p = p->nextarc;
}
printf("^\n");
}
}
销毁图
void DestroyAdj(AdjGraph*& G)
{
int i;
ArcNode* pre,* p;
for (i = 0; i < G->n; i++)
{
//p = (ArcNode*)malloc(sizeof(ArcNode));
pre = G->adjlist[i].firstarc;
if(pre != NULL)
{
p = pre->nextarc;
while (p != NULL)
{
free(pre);
pre = p;
p = pre->nextarc;
}
free(pre);
}
}
free(G);
}
邻接矩阵转邻接表
void MatToList(MatGraph g, AdjGraph*& G)
{
ArcNode* p;
int i, j;
G = (AdjGraph*)malloc(sizeof(AdjGraph));
for (i = 0; i < g.n; i++)
G->adjlist[i].firstarc = NULL;
for (i = 0; i < g.n; i++)
{
for (j = g.n - 1; j >= 0; j--)
{
if (g.edges[i][j] != 0 && g.edges[i][j] != INF)
{
p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = j;
p->weight = g.edges[i][j];
p->nextarc = G->adjlist[i].firstarc;
G->adjlist[i].firstarc = p;
}
}
}
G->n = g.n;
G->e = g.e;
}
邻接表转邻接矩阵
void ListToMat(MatGraph& g, AdjGraph* G)
{
ArcNode* p;
int i, j;
for (int i = 0; i < G->n; i++)
{
//p = (ArcNode*)malloc(sizeof(ArcNode));
p = G->adjlist[i].firstarc;
while (p!=NULL)
{
g.edges[i][p->adjvex] = p->weight;
p = p->nextarc;
}
}
g.n = G->n;
g.e = G->e;
}
深度优先遍历
int visit[MAXV] = { 0 };
void DFS(AdjGraph* G, int v)
{
ArcNode* p = G->adjlist[v].firstarc;
printf("%d ", v);
visit[v] = 1;
while (p != NULL)
{
if (visit[p->adjvex] == 0)
DFS(G,p->adjvex);
p = p->nextarc;
}
printf("\n");
}
广度优先遍历
void BFS(AdjGraph* G, int v)
{
SqQueue1* qu;
InitQueue1(qu);
ArcNode* p;
int visit[MAXV];
for (int i = 0; i < G->n; i++)
visit[i] = 0;
printf("%d ", v);
visit[v] = 1;
enQueue1(qu, v);
while (!QueueEmpty(qu))
{
deQueue(qu, v);
p = G->adjlist[v].firstarc;
while (p != NULL)
{
if (visit[p->adjvex] == 0)
{
printf("%d ", p->adjvex);
visit[p->adjvex] = 1;
enQueue1(qu, p->adjvex);
}
p = p->nextarc;
}
}
printf("\n");
}
深度优先遍历非连通无向图
void DFS1(AdjGraph* G)
{
for (int i = 0; i < G->n; i++)
{
if(visit[i]==0)
DFS(G, i);
}
}
广度优先遍历非连通无向图
void BFS1(AdjGraph* G)
{
for (int i = 0; i < G->n; i++)
if (visit[i] == 0)
BFS(G, i);
}
判断图的连通性
bool Connect(AdjGraph* G)
{
int i;
bool flag = true;
int visit[MAXV];
for (i = 0; i < G->n; i++)
visit[i] = 0;
BFS(G, 0);
for (i = 0; i < G->n; i++)
{
if (visit[i] == 0)
{
flag = false;
break;
}
}
return flag;
}
判断u到v是否存在简单路径
void ExistPath(AdjGraph* G, int u, int v, bool& has)
{
int w;
ArcNode* p;
visit[u] = 1;
if (u == v)
{
has = true;
return;
}
p = G->adjlist[u].firstarc;
while (p != NULL)
{
w = p->adjvex;
if (visit[w] == 0)
ExistPath(G, w, v, has);
p = p->nextarc;
}
}
输出u到v的一条简单路径
void FindPath(AdjGraph* G, int u, int v, int Path[], int d)
{
int w;
ArcNode* p;
visit[v] = 1;
Path[++d] = u;
if (u == v)
{
for (int i = 0; i <= d; i++)
printf("%d ", Path[i]);
printf("\n");
return;
}
p = G->adjlist[v].firstarc;
while (p != NULL)
{
w = p->adjvex;
if (visit[w] == 0)
FindPath(G, w, v, Path, d);
p = p->nextarc;
}
}
输出u到v的所有简单路径
void FindAllPath(AdjGraph* G, int u, int v, int Path[], int d)
{
int w;
ArcNode* p;
visit[u] = 1;
Path[++d] = u;
if (u == v && d >= 0)
{
for (int i = 0; i <= d; i++)
{
printf("%d ", Path[i]);
}
printf("\n");
}
p = G->adjlist[u].firstarc;
while (p != NULL)
{
w = p->adjvex;
if (visit[w] == 0)
FindAllPath(G, w, v, Path, d);
p = p->nextarc;
}
visit[u] = 0;
}
输出长度为l的简单路径
void PathLenAll(AdjGraph* G, int u, int v, int l, int Path[], int d)
{
int w;
ArcNode* p;
visit[u] = 1;
Path[++d] = u;
if (u == v && d == l)
{
for (int i = 0; i <= d; i++)
{
printf("%d ", Path[i]);
}
printf("\n");
}
p = G->adjlist[u].firstarc;
while (p != NULL)
{
w = p->adjvex;
if (visit[w] == 0)
FindAllPath(G, w, v, Path, d);
p = p->nextarc;
}
visit[u] = 0;
}
输出经过顶点k的简单回路
int visited[MAXV];
void DFSPath(AdjGraph* G, int u, int v, int path[], int d)
{
ArcNode* p;
int w, i;
visited[u] = 1;
path[++d] = u;
p = G->adjlist[u].firstarc;
while (p != NULL)
{
w = p->adjvex;
if (w == v && d > 1)
{
for (i = 0; i <= d; i++)
printf("%d ", path[i]);
printf("%d\n", v);
}
if (visited[w] == 0)
DFSPath(G, w, v, path, d);
p = p->nextarc;
}
visited[u] = 0;
}
void FindCyclePath(AdjGraph* G, int k)
{
int path[MAXV];
DFSPath(G, k, k, path, -1);
}
输出u到v的最短路径
typedef struct {
int data;
int parent;
}QUEUE;
void ShortPath(AdjGraph* G, int u, int v)
{
ArcNode* p;
int i, w;
int front = -1, rear = -1;
QUEUE qu[MAXV];
int visited[MAXV];
for (i = 0; i < G->n; i++)
visited[i] = 0;
rear++;
qu[rear].data = u;
qu[rear].parent = -1;
visited[u] = 1;
while (rear != front)
{
front++;
w = qu[front].data;
if (w == v)
{
i = front;
while (qu[i].parent!= -1)
{
printf("%d", qu[i].data);
i = qu[i].parent;
}
printf("%d\n", qu[i]);
return;
}
p = G->adjlist[w].firstarc;
while (p != NULL)
{
if (visited[p->adjvex] == 0)
{
rear++;
qu[rear].data = p->adjvex;
qu[rear].parent = front;
visited[p->adjvex] = 1;
}
p = p->nextarc;
}
}
}
输出距顶点v最远的一个顶点
int MaxList(AdjGraph* G, int v)
{
ArcNode* p;
int qu[MAXV];
int w, i, k;
int rear = 0, front = 0;
int visited[MAXV];
for (i = 0; i < G->n; i++)
visited[i] = 0;
rear++;
qu[rear] = v;
while (rear != front)
{
front = (front + 1) % MAXV;
k = qu[front];
p = G->adjlist[k].firstarc;
while (p != NULL)
{
if (visited[p->adjvex] == 0)
{
rear = (rear + 1) % MAXV;
qu[rear] = p->adjvex;
visited[p->adjvex] = 1;
}
p = p->nextarc;
}
}
return k;
}
标签:bsp parent ted oid lis 长度 null 优先 int
原文地址:https://www.cnblogs.com/KIROsola/p/11622281.html