How Long Does It Take (25分)【C语言】AOE拓扑排序

2024-04-23 16:38
文章标签 语言 25 排序 long 拓扑 take aoe

本文主要是介绍How Long Does It Take (25分)【C语言】AOE拓扑排序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 题目:
    • 输入格式
    • 输出格式
    • 输入样例
    • 输出样例
  • 算法
    • AOE拓扑排序
      • 代码实现
        • AOE函数
        • 邻接矩阵存储的图

习题讲解视频

题目:

Given the relations of all the activities of a project, you are supposed to find the earliest completion time of the project.

输入格式

Each input file contains one test case. Each case starts with a line containing two positive integers N (≤100), the number of activity check points (hence it is assumed that the check points are numbered from 0 to N−1), and M, the number of activities. Then M lines follow, each gives the description of an activity. For the i-th activity, three non-negative numbers are given: S[i], E[i], and L[i], where S[i] is the index of the starting check point, E[i] of the ending check point, and L[i] the lasting time of the activity. The numbers in a line are separated by a space.

输出格式

For each test case, if the scheduling is possible, print in a line its earliest completion time; or simply output “Impossible”.

输入样例

9 12
0 1 6
0 2 4
0 3 5
1 4 1
2 4 1
3 5 2
5 4 0
4 6 9
4 7 7
5 7 4
6 8 2
7 8 4

输出样例

18

算法

AOE拓扑排序

  • 入度为0的结点全部压入队列(如果是单一起点,压入指点结点即可)
  • while循环中弹出一个结点,对此节点的邻结点的入度减一(如果此邻结点入度减为0则直接入队)同时,更新此结点的earliest
  • 根据处理的结点总数判断时间安排是否合理。合理时,在所有结点中选择最大的earliest输出

代码实现

int main()
{	int N,E;scanf("%d %d",&N,&E);Graph G=CreateGraph(N);BuildGraph(G,E);AOE(G);return 0;
}
AOE函数
  • 入度为0的结点全部压入队列(如果是单一起点,压入指点结点即可)
  • while循环中弹出一个结点,对此节点的邻结点的入度减一(如果此邻结点入度减为0则直接入队)同时,更新此结点的earliest
  • 根据处理的结点总数判断时间安排是否合理。合理时,在所有结点中选择最大的earliest输出
void AOE(Graph G)
{int *earliest=(int*)malloc(sizeof(int)*(G->VertexNum));//记录每个结点完成的最早时间 int *indegree=(int*)malloc(sizeof(int)*(G->VertexNum));//记录每个结点的入度 int i,j;for(i=0;i<G->VertexNum;i++){//初始化earliest,indegreeearliest[i]=-1;indegree[i]=0;for(j=0;j<G->VertexNum;j++){if(G->GraphMatrix[j][i]!=-1){indegree[i]++;}}}int *Queue=(int*)malloc(sizeof(int)*(G->VertexNum+1));int rear=0,head=0;int count=0;//当前收录到集合中元素个数 for(i=0;i<G->VertexNum;i++){//收录初始入度为0的结点if(indegree[i]==0){ Queue[rear++]=i;earliest[i]=0;}}int t,MaxVertex;while(rear>head){t=Queue[head++];count++;for(i=0;i<G->VertexNum;i++){if((G->GraphMatrix[t][i]!=-1)){if(--indegree[i]==0){Queue[rear++]=i;}if(earliest[i]<earliest[t]+G->GraphMatrix[t][i]){earliest[i]=earliest[t]+G->GraphMatrix[t][i];} }} }if(count==G->VertexNum){int MaxSchedule=0;for(i=0;i<G->VertexNum;i++){if(earliest[i]>MaxSchedule){MaxSchedule=earliest[i];}}printf("%d",MaxSchedule);}else{printf("Impossible");}
}
邻接矩阵存储的图
#define MAXVERTEXNUM 101
typedef struct GNode* Graph;
struct GNode{int VertexNum;int EdgeNum;int GraphMatrix[MAXVERTEXNUM][MAXVERTEXNUM];
};
typedef struct ENode* edge;
struct ENode{int V;int W;int Weight;
};
Graph CreateGraph(int N)
{Graph G=(Graph)malloc(sizeof(struct GNode));G->VertexNum=N;int i,j;for(i=0;i<N;i++){for(j=0;j<N;j++){G->GraphMatrix[i][j]=-1;}}return G;
}
void InsertEdge(Graph G,edge L)
{G->GraphMatrix[L->V][L->W]=L->Weight;
}
void BuildGraph(Graph G,int E)
{G->EdgeNum=E;edge L=(edge)malloc(sizeof(struct ENode));int i;for(i=0;i<E;i++){scanf("%d %d %d",&(L->V),&(L->W),&(L->Weight));InsertEdge(G,L);}free(L);
}

这篇关于How Long Does It Take (25分)【C语言】AOE拓扑排序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/929327

相关文章

C语言中的数据类型强制转换

《C语言中的数据类型强制转换》:本文主要介绍C语言中的数据类型强制转换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C语言数据类型强制转换自动转换强制转换类型总结C语言数据类型强制转换强制类型转换:是通过类型转换运算来实现的,主要的数据类型转换分为自动转换

利用Go语言开发文件操作工具轻松处理所有文件

《利用Go语言开发文件操作工具轻松处理所有文件》在后端开发中,文件操作是一个非常常见但又容易出错的场景,本文小编要向大家介绍一个强大的Go语言文件操作工具库,它能帮你轻松处理各种文件操作场景... 目录为什么需要这个工具?核心功能详解1. 文件/目录存javascript在性检查2. 批量创建目录3. 文件

C语言实现两个变量值交换的三种方式

《C语言实现两个变量值交换的三种方式》两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的交换方式,其中第一种方式是最常用也是最实用的,后两种方式一般只在特殊限制下使用,需要的朋友可以参考下... 目录1.使用临时变量(推荐)2.相加和相减的方式(值较大时可能丢失数据)3.按位异或运算1.使用临时

使用C语言实现交换整数的奇数位和偶数位

《使用C语言实现交换整数的奇数位和偶数位》在C语言中,要交换一个整数的二进制位中的奇数位和偶数位,重点需要理解位操作,当我们谈论二进制位的奇数位和偶数位时,我们是指从右到左数的位置,本文给大家介绍了使... 目录一、问题描述二、解决思路三、函数实现四、宏实现五、总结一、问题描述使用C语言代码实现:将一个整

C++快速排序超详细讲解

《C++快速排序超详细讲解》快速排序是一种高效的排序算法,通过分治法将数组划分为两部分,递归排序,直到整个数组有序,通过代码解析和示例,详细解释了快速排序的工作原理和实现过程,需要的朋友可以参考下... 目录一、快速排序原理二、快速排序标准代码三、代码解析四、使用while循环的快速排序1.代码代码1.由快

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st

Go语言中最便捷的http请求包resty的使用详解

《Go语言中最便捷的http请求包resty的使用详解》go语言虽然自身就有net/http包,但是说实话用起来没那么好用,resty包是go语言中一个非常受欢迎的http请求处理包,下面我们一起来学... 目录安装一、一个简单的get二、带查询参数三、设置请求头、body四、设置表单数据五、处理响应六、超

C语言中的浮点数存储详解

《C语言中的浮点数存储详解》:本文主要介绍C语言中的浮点数存储详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、首先明确一个概念2、接下来,讲解C语言中浮点型数存储的规则2.1、可以将上述公式分为两部分来看2.2、问:十进制小数0.5该如何存储?2.3 浮点

基于Python实现多语言朗读与单词选择测验

《基于Python实现多语言朗读与单词选择测验》在数字化教育日益普及的今天,开发一款能够支持多语言朗读和单词选择测验的程序,对于语言学习者来说无疑是一个巨大的福音,下面我们就来用Python实现一个这... 目录一、项目概述二、环境准备三、实现朗读功能四、实现单词选择测验五、创建图形用户界面六、运行程序七、

使用Go语言开发一个命令行文件管理工具

《使用Go语言开发一个命令行文件管理工具》这篇文章主要为大家详细介绍了如何使用Go语言开发一款命令行文件管理工具,支持批量重命名,删除,创建,移动文件,需要的小伙伴可以了解下... 目录一、工具功能一览二、核心代码解析1. 主程序结构2. 批量重命名3. 批量删除4. 创建文件/目录5. 批量移动三、如何安