【王道数据结构】【chapter6图】【P258t7】

news/2024/7/20 21:24:58 标签: 数据结构, 深度优先, 算法, 考研, c++, 拓扑排序

试编写 利用DFS实现有向无环图的拓扑排序算法

#include <iostream>
#define maxsize 10
typedef struct node{
    int data;
    struct node *next;
}node ,*pnode;


pnode buynode(int x)
{
    pnode tmp=(pnode) malloc(sizeof (node));
    tmp->data=x;
    tmp->next= nullptr;
    return tmp;
}

pnode * graph(int point)//结点数量
{
    pnode * g=(pnode*) malloc(sizeof (pnode)*point);
    for(int i=0;i<point;i++)
        g[i]= buynode(i);
    return g;
}
void insert(pnode* g,int p1,int p2)//无向图
{
    pnode tmp=g[p1];
    while(tmp->next&&tmp->next->data<p2) tmp=tmp->next;
    pnode ne=tmp->next;
    tmp->next= buynode(p2);
    tmp->next->next=ne;

//    tmp=g[p2];
//    while(tmp->next&&tmp->next->data<p1) tmp=tmp->next;
//    ne=tmp->next;
//    tmp->next= buynode(p1);
//    tmp->next->next=ne;
}
void figure1(pnode* g)
{
    insert(g,0,1);
    insert(g,0,2);
    insert(g,1,3);
    insert(g,1,4);
    insert(g,2,4);
    insert(g,2,3);
    insert(g,5,2);
//    insert(g,1,2);
}
void print(pnode *g,int point)
{
    for(int i=0;i<point;i++)
    {
        pnode tmp=g[i];
        while(tmp) {
            printf("%3d",tmp->data);
            tmp=tmp->next;
        }
        puts("");
    }
}

void dfs(pnode * g,int point,int* &visited,int &time,int* &finishtime)
{
    visited[point]=1;
//    printf("%3d",point);
    pnode tmp=g[point];
    //先访问子节点,将子节点全部放问完了再访问根节点
    while(tmp->next)
    {
        if(!visited[tmp->next->data]) dfs(g,tmp->next->data,visited,time,finishtime);
        tmp=tmp->next;
    }
    time=time+1;
    finishtime[point]=time;
}
void dfstraverse(pnode* g ,int num)
{
    int * visited=(int *) malloc(sizeof (int)*maxsize);
    int *finishtime=(int*) malloc(sizeof (int)*num);
    for(int i=0;i<maxsize;i++) visited[i]=0;
    for(int i=0;i<num;i++) finishtime[i]=0;
    int time=0;
    for(int i=0;i<num;i++)
    {
        if(!visited[i]) dfs(g,i,visited,time,finishtime);
    }
//    puts("");
//    for(int i=0;i<num;i++) printf("%3d",finishtime[i]);
    puts("");
    for(int i=0;i<num;i++){
        for(int j=0;j<num;j++){
            if(finishtime[j]==num-i){
                printf("%2d->",j);
            }
        }
    }
}
int main() {
    pnode* g1=graph(6);
    figure1(g1);
    print(g1,6);
    dfstraverse(g1,6);
    return 0;
}

测试的图如下 


http://www.niftyadmin.cn/n/5394037.html

相关文章

Essential C++ 编程基础

Essential C 前言1.1 如何撰写 C程序1.2 对象的定义与初始化1.3 撰写表达式1.4 条件语句和循环语句1.5 如何运用Array和Vector1.6 指针带来弹性1.7 文件的读写 前言 通过Essential C笔记的形式对C相关重点知识进行汇总&#xff0c;读者通读此系列文章就可以轻松的把该语言基础捡…

vue3自定义实现悬浮固定按钮组件

目录 一、需求描述二、代码解读三、结果展示 一、需求描述 需要5个固定的悬浮圆&#xff0c;居于页面的右侧。鼠标悬浮在圆上面会显示对应的文字提示其中包含返回顶部悬浮圆&#xff0c;当页面滑至底部时出现&#xff0c;点击页面滑到顶部。点击按钮会给出弹窗 二、代码解读…

STM32控制数码管从0显示到99

首先 先画电路图吧&#xff01;打开proteus&#xff0c;导入相关器件&#xff0c;绘制电路图。如下&#xff1a;&#xff08;记得要保存啊&#xff01;发现模拟一遍程序就自动退出了&#xff0c;有bug&#xff0c;我是解决不了&#xff0c;所以就是要及时保存&#xff0c;自己重…

基于yolov2深度学习网络的火焰烟雾检测系统matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 .................................................................. load yolov2.mat% 加载…

代码随想录算法训练营29期|day60 任务以及具体安排

第九章 动态规划part17 647. 回文子串 class Solution {public int countSubstrings(String s) {char[] chars s.toCharArray();int len chars.length;boolean[][] dp new boolean[len][len];int result 0;for (int i len - 1; i > 0; i--) {for (int j i; j < le…

猫头虎分享已解决Bug || Error: Maximum update depth exceeded in React

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

Hive优化的21种方案

1、Fetch抓取 Fetch抓取是指&#xff0c;Hive中对某些情况的查询可以不必使用MapReduce计算。例如&#xff1a;SELECT * FROM employees;在这种情况下&#xff0c;Hive可以简单地读取employee对应的存储目录下的文件&#xff0c;然后输出查询结果到控制台。 在hive-default.x…

el-table样式问题:如何修改element-ui表格中按钮悬浮显示但是被el-table溢出隐藏的问题?

最近在写elment-ui样式表格中遇到了溢出隐藏的问题 修改前 修改后 是由于el-table__body-wrapper为 overflow&#xff1a;hidden导致的 解决方式&#xff1a; .el-table__body-wrapper {overflow: visible !important; } //或者 /deep/.el-table__body-wrapper {overflow: v…