c语言根据拓扑图构造邻接矩阵

c语言,请问大神怎么把这个改成有向图?建立一个邻接矩阵形式的图

void MGout(MGraph *mg){ //输出邻接矩阵

int i,j,k;

k=mg-n;

for(i=0;ik;i++){

for(j=0;jk;j++){

if(mg-edges[i][j]==1)

printf(“%-5d”,digit);

else

printf(“%-5d”,zero);

}

printf(“\n”);

}

}

用C语言实现 图的邻接表和邻接矩阵数据结构的定义、创建;图的深度优先遍历、广度优先遍历。

/*

                程序1:邻接表的dfs,bfs

                其中n是点的个数,m是边的个数,你需要输入m条有向边,如果要无向只需要反过来多加一遍即可。

*/

#include stdio.h

#include string.h

#define MAXM 100000

#define MAXN 10000

int next[MAXM],first[MAXN],en[MAXM],n,m,flag[MAXN],pd,dl[MAXN],head,tail;

void input_data()

{

                scanf(“%d%d”,n,m);

                int i,x,y;

                for (i=1;i=m;i++)

                                {

                                                int x,y;

                                                scanf(“%d%d”,x,y);

                                                next[i]=first[x];

                                                first[x]=i;

                                                en[i]=y;

                                }

}

void pre()

{

                memset(flag,0,sizeof(flag));

                pd=0;

}

void dfs(int x)

{

                flag[x]=1;

                if (!pd)

                                {

                                                pd=1;

                                                printf(“%d”,x);

                                }else

                                                printf(” %d”,x);

                int p=first[x];

                while (p!=0)

                                {

                                                int y=en[p];

                                                if (!flag[y])   dfs(y);

                                                p=next[p];

                                }

}

void bfs(int k)

{

                head=0;tail=1;

                flag[k]=1;dl[1]=k;

                while (headtail)

                                {

                                                int x=dl[++head];

                                                if (!pd)

                                                                {

                                                                                pd=1;

                                                                                printf(“%d”,x);

                                                                }else printf(” %d”,x);

                                                int p=first[x];

                                                while (p!=0)

                                                                {

                                                                                int y=en[p];

                                                                                if (!flag[y])

                                                                                                {

                                                                                                                flag[y]=1;

                                                                                                                dl[++tail]=y;

                                                                                                }

                                                                                p=next[p];

                                                                }

                                }

}

int main()

{

                input_data();//读入图信息。

                pre();//初始化

                printf(“图的深度优先遍历结果:”);

                int i;

                for (i=1;i=n;i++)//对整张图进行dfs; 加这个for主要是为了防止不多个子图的情况

                                if (!flag[i])

                                                dfs(i);

                printf(“\n————————————————————-\n”);

                pre();//初始化

                printf(“图的广度优先遍历结果为:”);

                for (i=1;i=n;i++)

                                if (!flag[i])

                                                bfs(i);

                printf(“\n———————-end————————————\n”);

                return 0;

}

/*

                程序2:邻接矩阵

                图的广度优先遍历和深度优先遍历

*/

#include stdio.h

#include string.h

#define MAXN 1000

int n,m,w[MAXN][MAXN],flag[MAXN],pd,dl[MAXN];

void input_data()

{

                scanf(“%d%d”,n,m);

                int i;

                for (i=1;i=m;i++)

                                {

                                                int x,y;

                                                scanf(“%d%d”,x,y);

                                                w[x][0]++;

                                                w[x][w[x][0]]=y;

                                }

}

void pre()

{

                memset(flag,0,sizeof(flag));

                pd=0;

}

void dfs(int x)

{

                flag[x]=1;

                if (!pd)

                                {

                                                pd=1;

                                                printf(“%d”,x);

                                }else printf(” %d”,x);

                int i;

                for (i=1;i=w[x][0];i++)

                                {

                                                int y=w[x][i];

                                                if (!flag[y])   dfs(y);

                                }

}

void bfs(int t)

{

                int head=0,tail=1;

                dl[1]=t;flag[t]=1;

                while (headtail)

                {

                                int x=dl[++head];

                                if (!pd)

                                                {

                                                                pd=1;

                                                                printf(“%d”,x);

                                                }else printf(” %d”,x);

                                int i;

                                for (i=1;i=w[x][0];i++)

                                                {

                                                                int y=w[x][i];

                                                                if (!flag[y])

                                                                                {

                                                                                                flag[y]=1;

                                                                                                dl[++tail]=y;

                                                                                }

                                                }

                }

}

int main()

{

                input_data();

                printf(“图的深度优先遍历结果:”);

                pre();

                int i;

                for (i=1;i=n;i++)

                                if (!flag[i])

                                                dfs(i);

                printf(“\n—————————————————————\n”);

                printf(“图的广度优先遍历结果:”);

                pre();

                for (i=1;i=n;i++)

                                if (!flag[i])

                                                bfs(i);

                printf(“\n—————————–end——————————–\n”);

                return 0;

}

用c语言编程 1创建图的邻接矩阵和邻接表 2验证图的深度优先、广度优先遍历算法 3验证最短路径

这些是c++的代码不知是否满足你的要求。

1、邻接表表示的图中分别用DFS和BFS遍历

#include cstdio

#include cstring

#include queue

using namespace std;

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Description: 图的邻接表的结点

struct Edge

{

int dest; // 目标结点下标

// int value; // 路径长度

Edge *link; // 下一个结点

};

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Description: 为图添加一条边

// Input: edge – 欲加边的结点; dest – 目的结点

// Output: edge – 加边后的结点

// Tags:

void AddEdge(Edge *edge, int dest)

{

// 简单的链表操作

if (!edge)

{

edge = new Edge;

edge-dest = dest;

edge-link = 0;

}

else

{

Edge *tail = edge;

while (tail-link) tail = tail-link;

tail-link = new Edge;

tail = tail-link;

tail-dest = dest;

tail-link = 0;

}

}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Description: Console下输入图的边

// Input: Graph – 图; n – 图的结点的个数; EdgeNumber – 添加边的个数;

// Output: Graph – 添加边后的图

// Tags: 用户输入点对(a, b), 表示添加a-b的路径

void Input(Edge **graph, int n, int EdgeNumber)

{

int i = 0, a, b;

for (i = 0; i EdgeNumber; i++)

{

scanf(“%d %d”, a, b); // 用户输入起点终点

AddEdge(graph[a], b); // 添加a-b的边

}

}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Description: 深度优先搜索并输出

// Input: Graph – 图; n – 图的结点的个数; StartEdge — 开始的结点;

// Output: Console下输出遍历的顺序

// Tags: 递归调用 _dfs过程、回溯算法

void _dfs(Edge **graph, bool *visited, int n, int index);

void DFS(Edge **graph, int n, int StartEdge)

{

bool *visited = new bool[n]; // 标记每个结点是否已访问

memset(visited, (int)false, sizeof(bool) * n);

visited[StartEdge] = true;

printf(“start edge: %d\n”, StartEdge);

_dfs(graph, visited, n, StartEdge);

visited[StartEdge] = false;

}

// _dfs过程:

// Input: Graph – 图; n – 图的结点的个数; index – 当前的下标, visited – 记录结点是否已访问

// Output: Console下输出遍历的顺序

void _dfs(Edge **graph, bool *visited, int n, int index)

{

int nIndex; // 下一个结点下标

Edge *edge = graph[index]; // 遍历用结点

while (edge) // 遍历所有的邻接结点

{

nIndex = edge-dest;

if (!visited[nIndex])

{

visited[nIndex] = true;

printf(“%d\t”, nIndex);

_dfs(graph, visited, n, nIndex);

}

edge = edge-link;

}

}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Description: 广度优先搜索并输出

// Input: Graph – 图; n – 图的结点的个数; StartEdge – 开始的结点

// Output: Console下输出遍历的顺序

// Tags: 需要一个队列记录所有的灰色结点

void BFS(Edge **graph, int n, int StartEdge)

{

bool *visited = new bool[n]; // 记录结点是否已访问

memset(visited, (int)false, sizeof(bool) * n);

queueint Q; // 记录准备访问的结点

Edge *edge; // 记录当前遍历的结点

int nIndex; // 记录下标

visited[StartEdge] = true;

printf(“start edge:%d\n”, StartEdge);

Q.push(StartEdge);

while (!Q.empty())

{

edge = graph[Q.front()];

while (edge)

{

nIndex = edge-dest;

if (!visited[nIndex])

{

visited[nIndex] = true;

printf(“%d\t”, nIndex);

Q.push(nIndex);

}

edge = edge-link;

}

Q.pop();

}

}

int main()

{

const int NODE_NUMBER = 7; // 10结点

const int EDGE_NUMBER = 11; // 10边

Edge **graph = new Edge *[NODE_NUMBER]; // 图

memset(graph, 0, sizeof(Edge *) * NODE_NUMBER); // 一开始没边

Input(graph, NODE_NUMBER, EDGE_NUMBER); // 输入边

printf(“DFS:\n”);

DFS(graph, NODE_NUMBER, 0); // 深度优先

printf(“\n”);

printf(“BFS:\n”);

BFS(graph, NODE_NUMBER, 0); // 广度优先

printf(“\n”);

return 0;

}

2、邻接矩阵表示的图中利用bellman-ford算法获得单点最短路

#include cstdio

#include cstring

using namespace std;

#define INTEGER_INF 0xffff // 表示无穷大路径

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Description: 邻接矩阵表示的图

struct Graph

{

int **value; // 权值

int number; // 结点个数

};

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Description: 初始化图

// Input: number – 结点个数

// Output: graph – 图

void InitGraph(Graph graph, int number)

{

int i, j;

graph.value = new int *[number];

for (i = 0; i number; i++)

graph.value[i] = new int[number];

for (i = 0; i number; i++)

{

for (j = 0; j number; j++)

{

if (i == j)

graph.value[i][j] = 0;

else

graph.value[i][j] = INTEGER_INF;

}

}

graph.number = number;

}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Description: 析构图

// Input: graph – 图

// Output: graph – 析构后的图的壳子

void FreeGraph(Graph graph)

{

int i;

for (i = 0; i graph.number; i++)

delete []graph.value[i];

delete []graph.value;

graph.number = 0;

}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Description: 用户在Console下输入图的边

// Input: n – 边的数量

// Output: graph – 加边后的图

void AddEdge(Graph graph, int n)

{

int i, a, b, v;

for (i = 0; i n; i++)

{

scanf(“%d%d%d”, a, b, v);

graph.value[a][b] = v;

}

}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Description: BellmanFord 算法计算单源最短路

// Input: graph – 图, index – 起点

// Output: true – 存在最短路 且 Console 下输出起点到各个顶点的最短路

// false – 不存在最短路(存在边权和为负的环路)

bool BellmanFord(Graph graph, int index)

{

int num = graph.number; // 结点个数

int *v = new int[num]; // 记录最短路

int i, j, t;

// 设定初值

for (t = 1; t num; t++)

v[t] = INTEGER_INF;

v[index] = 0;

// 松弛

for (t = 0; t num – 1; t++) // 循环i-1次

for (i = 0; i num; i++)

for(j = 0; j num; j++)

if (i != j graph.value[i][j] != INTEGER_INF) // 如果两顶点间有路

if (v[j] v[i] + graph.value[i][j]) // 松弛

v[j] = v[i] + graph.value[i][j];

// 判断是否存在边权和为负的环路

for (i = 0; i num; i++)

for (j = 0; j num; j++)

if (graph.value[i][j] != INTEGER_INF

v[j] v[i] + graph.value[i][j])

return false;

// 输出

for (t = 1; t num; t++)

printf(“%d\t”, v[t]);

return true;

}

int main()

{

Graph graph;

InitGraph(graph, 5);

AddEdge(graph, 10);

if (!BellmanFord(graph, 0))

printf(“该图中存在边权和为负的环路!\n”);

FreeGraph(graph);

return 0;

}

c语言根据拓扑图构造邻接矩阵

简单拓扑排序算法C语言

#include cstdio

#include cstring

#include stack

using namespace std;

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Description: 表示图的结点的邻接边

struct Edge

{

int dest;

Edge *next;

} **graph;

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Description: 添加一个边

// Input: e – 要添加边的结点, p – 目的地

// Output: e – 添加边后的结点

void AddEdge(Edge *e, int p)

{

if(!e)

{

e = new Edge;

e-dest = p;

e-next = 0;

}

else

{

Edge *tail = e;

while (tail-next) tail = tail-next;

tail-next = new Edge;

tail = tail-next;

tail-dest = p;

tail-next = 0;

}

}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Description: 输入结点之间的边

// Input: Console下用户输入,起点和终点; m – 边的个数

// Output: graph – 图;

void Input(int m)

{

int i, a, b;// a-b存在边(有向)

for (i = 0; i m; i++)

{

scanf(“%d %d”, a, b);

AddEdge(graph[a], b);

}

}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Description: 获得每个结点的入度

// Input: n – 结点的个数

// Output: degree – 每个结点的入度

void GetDegree(int *degree, int n)

{

int i = 0;

Edge *edge;

memset(degree, 0, sizeof(int) * n);

for (i = 0; i n; i++)

{

edge = graph[i];

while(edge)

{

degree[edge-dest]++;

edge = edge-next;

}

}

}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

// Description: 拓扑排序

// Input: n – 结点个数

// Output: console下输出一个正确的拓扑序

void TopoSort(int n)

{

int *degree = new int[n];// 初始化所有结点的入度

GetDegree(degree, n);

stackint s;// 获得入度为0的结点,并入栈

int i = 0;

for (i = 0; i n; i++)

if (degree[i] == 0)

s.push(i);

int index = 0;// 结点的下标

Edge *edge; // 当前结点邻接表

while (!s.empty())

{

index = s.top();

printf(“%d”, index);

s.pop();

edge = graph[index];

while (edge)

{

if (–degree[edge-dest] == 0)

s.push(edge-dest);

edge = edge-next;

}

}

delete []degree;

}

int main()

{

int n, m;// 结点个数、边个数

scanf(“%d %d”, n, m);

int i;

graph = new Edge*[n];

for(i = 0; i n; i++) graph[i] = 0;

Input(m);

TopoSort(n);

return 0;

}

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年3月28日 14:14:24
下一篇 2024年3月28日 14:23:40

相关推荐

  • c语言改写模式,c语言实现修改功能

    c语言程序修改? 1、这个程序有4个错误,我都加粗了,第一个是m没有赋初值,第二个是while表达式中的ch=getchar()需要括号括起来,第三个是m=m*10+ch-0中的0也需要用单引号括起来,第四个是第2个while中为m!=0。 2、define容易造成误会,因为不符合一般的编程习惯,false 0, true 1;scanf放在你的那个地方是达…

    2024年5月23日
    3900
  • c语言控制代码的换码序列,c语言交换代码

    求C语言编程大神解答一下下面这个编程代码? k==5,用5去除125余0,所以r=125%5中r为0。由于!0为1,所以执行while循环体:先打印出5(k的值),再n=n/k==125/5=25;由于251则再打印出*号。这一循环结果输出是5*。 下面是我的代码,三个函数分别对应三个问题。 在实现基本要求的前提下,拓展了可以从键盘输入的功能,以下为各题代码…

    2024年5月23日
    5600
  • c语言扫描io脚状态,c语言端口扫描

    求51单片机的上升沿和下降沿C语言检测程序列子,端口就是普通IO口。 上升沿触发是当信号有上升沿时的开关动作,当电位由低变高而触发输出变化的就叫上升沿触发。也就是当测到的信号电位是从低到高也就是上升时就触发,叫做上升沿触发。 单片机怎么计算1s内下降沿的个数的C语言程序或者计算两个下降沿的时间(检测脉冲频率)计算1s内下降沿的个数方法是,一个定时器设置定时1…

    2024年5月23日
    4400
  • c语言mallloc使用的简单介绍

    C语言中使用malloc必须加#includemallo.h? 1、在C语言中使用malloc函数进行动态内存分配。malloc的全称是memory allocation,中文叫动态内存分配。原型:extern void malloc(unsigned int num_bytes);功能:分配长度为num_bytes字节的内存块。 2、你可以看一下C语言那本…

    2024年5月23日
    4400
  • c语言三位小数,C语言三位小数

    怎样用C++语言输出精确到小数点后三位的数? 1、用C++语言输出精确到小数点后三位的数,可以参考下面给出的代码:coutsetiosflags(ios:fixed)setprecision(3)。其中 setiosflags中set是设置的意思。ios是iostream的缩写,即输入输出流。flags是标志的意思。 2、要精确到小数点后若干位,则数据类型为…

    2024年5月23日
    7200
  • c语言21点游戏,二十一点游戏代码c语言

    如何使用C语言编写简单小游戏? 1、数学知识:长方形的面积S=a*b 长方形周长L=2*(a+b)其中a b分别为长方形的宽和高。算法分析:长方形面积及周长均依赖于宽和高,所以先要输入宽高值,然后根据公式计算,输出结果即可。 2、/*也不知道你是什么级别的,我是一个新手,刚接触编程语言,以下是我自己变得一个小程序,在所有c语言的编译器(vc++0、turbo…

    2024年5月23日
    6300
  • c语言当中的null,C语言当中的符号

    C/C++中,NULL和null的区别是什么? nul 和 null要看编译器,不同的编译器有所区别。 所以C或者C++中都使用一个特殊定义NULL表示无效值,其本质就是未定义具体数据类型的0值。 null是是什么都没有的意思。在java中表示空对象。 本意是“空的;元素只有零的”意思。计算机中通常表示空值,无结果,或是空集合。\x0d\x0a在ASCII码…

    2024年5月23日
    4500
  • 包含c语言对txt文件命名的词条

    如何在C语言编程里面修改源文件名字 如果你是在WINDOWS的话,简单了,随便用个编辑器,比如记事本,然后写c源程序,保存到你想要保存的位置。如果你在DOS下,可以用edit,写好以后,按alt键,选择文件菜单,然后保存。 用open打开文件,注意操作模式使用“修改”或者“添加” 用write或者fprintf向文件中写入你的内容。 用close关闭文件。 …

    2024年5月23日
    4800
  • 学c语言编程,学c语言编程用什么软件

    编程开发必须要学C语言吗? 1、要学习。编程开发的学习内容主要包括c语言、python和c+语言。C语言作为一种简单灵活的高级编程语言,它是一个面向过程的语言,一般是作为计算机专业的基础入门语言课程。 2、C语言。对于刚接触编程的人来说,先学习C语言是非常重要的。C语言可以说是是计算机编程语言的鼻祖,其他的编程语言几乎全是由C语言变化衍生出来的。 3、不需要…

    2024年5月23日
    3400
  • c语言用string定义字符串,c语言中用string类型来处理字符串类型

    C++怎样定义定义字符串 1、第一是字符数组来表示字符串。用下面的语句声明:char a[10];C语言中字符数组与字符串的唯一区别是字符串末尾有一个结束符\0,而字符数组不需要。 2、在C中定义字符串有下列几种形式:字符串常量,char数组,char指针 字符串常量 即:位于一对双括号中的任何字符。双引号里的字符加上编译器自动提供的结束标志\0字符,作为 …

    2024年5月23日
    4300

发表回复

登录后才能评论



关注微信