int maxFlow(AdjMatrix* graph, int source, int sink) { int n = graph->vertex_num; // 创建残留网络 int residual[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; memcpy(residual, graph->matrix, sizeof(residual)); int parent[MAX_VERTEX_NUM]; int max_flow = 0; while (true) { // 使用BFS寻找增广路径 memset(parent, -1, sizeof(parent)); queue<int> q; q.push(source); parent[source] = source; while (!q.empty()) { int u = q.front(); q.pop(); for (int v = 0; v < n; v++) { if (parent[v] == -1 && residual[u][v] > 0) { parent[v] = u; q.push(v); } } } // 如果不存在增广路径,则退出循环 if (parent[sink] == -1) { break; } // 计算增广路径上的最小流量 int path_flow = INF; for (int v = sink; v != source; v = parent[v]) { int u = parent[v]; path_flow = min(path_flow, residual[u][v]); } // 更新残留网络,并累加最大流量 for (int v = sink; v != source; v = parent[v]) { int u = parent[v]; residual[u][v] -= path_flow; residual[v][u] += path_flow; } max_flow += path_flow; } return max_flow; }
时间: 2024-02-14 21:35:57 浏览: 211
这是一个求解最大流的算法,使用的是 Edmonds-Karp 算法,时间复杂度为 O(VE^2)。其中,graph 是给定的图的邻接矩阵,source 是源点,sink 是汇点。算法的核心是不断寻找增广路径,并更新残留网络,直到不存在增广路径为止。在每次寻找增广路径时,使用 BFS 算法,计算增广路径的最小流量,然后更新残留网络,累加最大流量。
相关问题
优化这段代码#define _CRT_SECURE_NO_WARNINGS #pragma warning(disable:4996) #include<stdio.h> #include<stdlib.h> #define MAX_VERTEX_NUM 20// 邻接矩阵无向图结构体 #define inf 32768 typedef char VertexData; typedef struct { char vertex[MAX_VERTEX_NUM]; // 顶点表 int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵 int vexnum, arcnum; // 顶点数 } AdjMatrix;// 初始化无向图 int LocateVertes(AdjMatrix* G, char v) //顶点位置 { int j = 0, k; for (k = 0; k < G->vexnum; k++) if (G->vertex[k] == v) { j = k; break; } return j; } void CreateUDG(AdjMatrix* G) //无向图 { int i; int j; int k; char v1, v2; scanf("%d,%d", &G->vexnum, &G->arcnum); getchar(); for (i = 0; i < G->vexnum; i++) for (j = 0; j < G->vexnum; j++) G->arcs[i][j] = 0; for (i = 0; i < G->vexnum; i++) scanf("%c", &G->vertex[i]); getchar(); for (k = 0; k < G->arcnum; k++) { scanf("%c,%c", &v1, &v2); getchar(); i = LocateVertes(G, v1); i = LocateVertes(G, v2); G->arcs[i][j] = 1; } for (i = 0; i < G->vexnum; i++) { for (j = 0; j < G->vexnum; j++) printf("%d", G->arcs[i][j]); printf("\n"); } } int main() { AdjMatrix G; CreateUDG(&G); return 0; }
1. 代码格式化
代码格式化可以使代码更加清晰易读,建议使用代码编辑器自带的格式化工具或使用在线格式化工具进行格式化。
2. 函数分离
可以将 `LocateVertes` 函数和 `CreateUDG` 函数分离到不同的文件中,使代码结构更加清晰。
3. 输入处理
在输入顶点和边时,建议使用循环读入输入,而不是使用 `getchar()`,这样可以避免输入错误导致程序出错。
4. 变量名修改
变量名需要更改,使其符合编程规范。例如,`v1` 和 `v2` 可以改为 `vertex1` 和 `vertex2`。
5. 注释添加
在关键部分添加注释,可以使代码更加易读,方便其他开发人员阅读和修改代码。
修改后的代码如下:
```c
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)
#include<stdio.h>
#include<stdlib.h>
#define MAX_VERTEX_NUM 20
#define INF 32768
typedef char VertexData;
typedef struct {
char vertex[MAX_VERTEX_NUM]; // 顶点表
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
int vexnum, arcnum; // 顶点数
} AdjMatrix;
// 顶点位置
int locateVertex(AdjMatrix* G, char v) {
int i;
for (i = 0; i < G->vexnum; i++) {
if (G->vertex[i] == v) {
return i;
}
}
return -1;
}
// 初始化无向图
void createUDG(AdjMatrix* G) {
int i;
int j;
int k;
char vertex1, vertex2;
scanf("%d,%d", &G->vexnum, &G->arcnum);
// 读取顶点
for (i = 0; i < G->vexnum; i++) {
scanf(" %c", &G->vertex[i]);
}
// 初始化邻接矩阵
for (i = 0; i < G->vexnum; i++) {
for (j = 0; j < G->vexnum; j++) {
G->arcs[i][j] = INF;
}
}
// 读取边
for (k = 0; k < G->arcnum; k++) {
scanf(" %c,%c", &vertex1, &vertex2);
i = locateVertex(G, vertex1);
j = locateVertex(G, vertex2);
G->arcs[i][j] = 1;
G->arcs[j][i] = 1; // 无向图,需要将两个方向都设置为1
}
for (i = 0; i < G->vexnum; i++) {
for (j = 0; j < G->vexnum; j++) {
printf("%d", G->arcs[i][j]);
}
printf("\n");
}
}
int main() {
AdjMatrix G;
createUDG(&G);
return 0;
}
```
#include <stdio.h> #include <stdlib.h> #define MAX_VERTEX_NUM 20 #define INFINITY 65535 #define TRUE 1 #define FALSE 0 #define OK 1 #define FAIL 0 typedef int Status; typedef enum { DG, DN, UDG, UDN } GraphKind; typedef struct ArcCell { int adjvex; int weight; } ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef struct { int vertex[MAX_VERTEX_NUM]; int arc[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; int vexnum, arcnum; GraphKind kind; } MGraph; int LocateVex(MGraph G, int v) { int i; for (i = 0; i < G.vexnum; i++) if (G.vertex[i] == v) return i; return -1; } Status CreateDN(MGraph* G) { int i, j, k, w, v1, v2; ArcCell* p; printf("input the number of vertexes and arcs: "); scanf("%d,%d", &G->vexnum, &G->arcnum); for (i = 0; i < G->vexnum; i++) { printf("input the %dth vertex: ", i); scanf("%d", &G->vertex[i]); } for (i = 0; i < G->vexnum; i++) for (j = 0; j < G->vexnum; j++) G->arc[i][j] = INFINITY; for (k = 0; k < G->arcnum; k++) { printf("input the %dth arc: ", k); scanf("%d,%d,%d", &v1, &v2, &w); i = LocateVex(*G, v1); j = LocateVex(*G, v2); G->arc[i][j] = w; // G->arc[j][i] = w; } return OK; } void OutputDN(MGraph G) { int i, j; for (i = 0; i < G.vexnum; i++) { printf("%d:", G.vertex[i]); for (j = 0; j < G.vexnum; j++) printf("%5d ", G.arc[i][j]); printf("\n"); } } int main(void) { MGraph G; CreateDN(&G); OutputDN(G); printf("success\n"); return 0; }
这段代码是用 C 语言实现的一个有向图的建立和输出的程序,其中包含了邻接矩阵的定义和相关操作函数,可以用于创建一个带权有向图,并输出其邻接矩阵。具体实现包括创建有向图的函数 CreateDN,输出邻接矩阵的函数 OutputDN,以及定位某个顶点的函数 LocateVex 等。其中,CreateDN 函数会根据用户输入的顶点数、边数和每条边的起点、终点和权重信息来创建一个有向图,而 OutputDN 函数则会遍历整个邻接矩阵并输出其中的所有元素。
阅读全文