问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-05-13 18:25

我来回答

1个回答

热心网友 时间:2023-10-20 12:43

/*
                程序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 (head<tail)
                                {
                                                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 (head<tail)
                {
                                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;
}

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
你喜欢外柔内刚的女孩还是外刚内柔的女孩? 男人喜欢外柔内刚还是外刚内柔型的女生 ...怎样涂好颜色啊,用彩笔还是彩铅啊...谢谢啦 ...也转动了,但是里面却没有动静,也没有风不过半分钟就关了,不是... 空调开机没反应,用遥控器点开关没反应,确定不是遥控器问题,空调重新插... 请问一下 上海电信的融合宽带一个月多少钱? 本人男 脸太圆想要瘦脸 不用药 女生初涉期货行业从事什么岗位比较好 为什么较少女生选择做期货交易 我现在就读大学,现在学校里新建一个期货专业,我在考虑转专业_百度知 ... 图的遍历:深度优先搜索(邻接矩阵存放) 数据结构 第二小题基于邻接矩阵求从顶点B出发的深度优先遍历。 请问基于邻接矩阵的话深度优先遍历是否 一般送夜客在晚上几点钟好,送的时候该说些什么话迷信类? 已知图的邻接矩阵如图1. 所示,则从顶点0出发按深度优先遍历的结果是( ) 秋月古诗的好段 已知图的邻接矩阵,根据算法思想,则从顶点0出发按深度优先遍历的结点序列是 巡夜客有难是什么电影 我前几段时间手机话费是15,用手机支付宝的花呗支出话费12元,手机既没有通过任何方式充值话费,几天 有‘夜客’商标的桶装椰子油是什么牌子的在哪能买到 和夜客差不多的交友软件,谢谢! 夜客苹果下不了怎么办 谁知道夜客网是做什么的? 电脑怎么登录2个 怎样在电脑上同时登陆两个 电脑怎么同时登两个 求好看的古装电视剧/电影. 电脑如何登陆两个 代理记账一年多少钱 如何使用gcc在EditPlus编辑器下对GTK程序进行静态编译 Linux下codeblocks怎么配置才能实现pkg-config的功能啊? 数据结构C++无向图的邻接矩阵深度优先遍历,求解答 pta 遍历时用裁判定义的函数 4-2 邻接矩阵存储图的深度优先遍历 (20分) 哪位大侠帮我看一下这道邻接矩阵写出深度优先遍历的题~~~教我方法吧 用邻接矩阵存储无向图,并用深度优先和广度优先遍历搜索输出序列,要能运行的,并把运行的结果截图下来 c语言邻接矩阵建造一个无向图并深度优先遍历 请问我写的程序为啥只能输出部分节点。。高手帮帮忙 爱丫爱丫舞蹈教学视频 爵士舞能减肥吗 简单易学 vivo哪些手机是康宁大猩猩屏幕的 vivoX7用的是康宁大猩猩屏幕吗 我的是VIVO X510t的手机,我想问我的手机玻璃的康宁的大猩猩玻璃吗? vivonex双屏版和努比亚x哪个好? vivo NEX手机大屏容易碎吗? vivoX21 i 手机的屏幕保护玻璃用的是康宁大猩猩吗?第几代的? 屏幕是大猩猩玻璃吗?第几代的 问一下大神opporeno和vivox27这两款手机用的是康宁大猩猩玻璃几代屏幕,两者看电视电影哪? 吸出的母乳热一下可以放多久 热了的母乳可以放多久 热完一遍的母乳可以放多久 母乳加热后能放多久还可以喝 大学毕业后可以考哪些证? 母乳从冰箱拿出来热之后可以放多久