用c语言写一个程序。要求查找算法:程序要求根据文件中给定的数据设定一个高效的查找我们选取的任意点的所有一次邻接点和二次邻接点,并通过颜色标明图形显示的方法展示选定结点的一次邻接点和二次邻接点及关联边。
时间: 2023-11-28 20:47:35 浏览: 54
以下是一个用C语言实现的根据文件中给定的数据设定一个高效的查找我们选取的任意点的所有一次邻接点和二次邻接点,并通过颜色标明图形显示的程序。该程序使用邻接矩阵来表示图。
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTICES 100 // 图中最多有100个顶点
int matrix[MAX_VERTICES][MAX_VERTICES]; // 邻接矩阵
int color[MAX_VERTICES]; // 顶点颜色
int vertices; // 图中顶点数
// 访问顶点v的邻接点
void visit(int v) {
printf("%d ", v);
}
// 深度优先遍历
void dfs(int v, int depth) {
int i;
color[v] = depth % 2 + 1; // 根据深度设置顶点颜色
visit(v); // 访问顶点
for (i = 0; i < vertices; i++) {
if (matrix[v][i] && color[i] == 0) { // 如果顶点i是v的邻接点且未被访问
dfs(i, depth + 1); // 递归访问顶点i
}
}
}
// 读取文件中的数据
void read_data(char* filename) {
int i, j;
FILE* fp;
fp = fopen(filename, "r");
fscanf(fp, "%d", &vertices); // 读取顶点数
for (i = 0; i < vertices; i++) {
for (j = 0; j < vertices; j++) {
fscanf(fp, "%d", &matrix[i][j]); // 读取邻接矩阵
}
}
fclose(fp);
}
// 显示图形
void show_graph(int start) {
int i, j;
printf("\n\n");
for (i = 0; i < vertices; i++) {
for (j = 0; j < vertices; j++) {
if (i == start || j == start || i == j || matrix[i][j] == 0) { // 不显示与起点无关的边
printf(" ");
} else if (color[i] == color[j]) { // 显示与起点同层的边
printf("\033[0;32m*\033[0m ");
} else { // 显示与起点不同层的边
printf("\033[0;31m*\033[0m ");
}
}
printf("\n");
}
}
int main(int argc, char** argv) {
int start;
if (argc != 3) {
printf("Usage: %s filename start_vertex\n", argv[0]);
return 1;
}
read_data(argv[1]); // 读取文件中的数据
start = atoi(argv[2]); // 起点为命令行参数指定的顶点
dfs(start, 0); // 从起点开始深度优先遍历
printf("\n");
show_graph(start); // 显示图形
return 0;
}
```
该程序需要两个命令行参数:文件名和起点顶点的编号。文件中第一行是顶点数,接下来是邻接矩阵。例如,下面是一个文件的示例内容:
```
5
0 1 1 0 1
1 0 1 1 0
1 1 0 1 0
0 1 1 0 1
1 0 0 1 0
```
运行程序的命令如下:
```
./program filename start_vertex
```
其中,`filename`是包含图数据的文件名,`start_vertex`是起点顶点的编号。该程序会输出从起点开始的深度优先遍历结果,并显示一个图形,其中与起点同层的边用绿色显示,与起点不同层的边用红色显示。
阅读全文