08-图8 How Long Does It Take

本文介绍了一个基于最早时间的课程调度算法实现。通过定义各种数组来记录节点之间的关系和时间信息,利用队列进行广度优先搜索,实现了课程的最早完成时间计算。特别地,该算法能够处理有向图中顶点的入度、出度,并计算每个任务的最早开始时间。
#include <stdio.h>

#define Max 100
int Graph[Max][Max], Indegree[Max], Outdegree[Max], Earliest[Max];

int max(int a, int b)
{
	if (a > b)
		return a;
	else
		return b;	
}

int Earliest_Time(int N);

int main(int argc, char const *argv[])
{
	freopen("test.txt", "r", stdin);
	int N, M;
	scanf("%d %d", &N, &M);
	for (int i = 0; i < N; i++){
		for (int j = 0; j < N; j++){
			Graph[i][j] = -1;
		}
		Indegree[i] = 0;
		Outdegree[i] = 0;
		Earliest[i] = 0;
	}
	int s, e, c;
	for (int i = 0; i < M; i++){
		scanf("%d %d %d", &s, &e, &c);
		Graph[s][e] = c;
		Outdegree[s]++;
		Indegree[e]++;
	}
	int res = Earliest_Time(N);
	if (res != -1){
		printf("%d", res);
	}
	else
		printf("Impossible");
	return 0;
}

int Earliest_Time(int N)
{
	int queue[N], front = 0, rear = 0;
	for (int i = 0; i < N; i++){
		if (Indegree[i] == 0){
			queue[rear++] = i;
			Indegree[i]--;
		}
	}
	int cnt = 0, v;
	while (rear - front){
		v = queue[front++];
		cnt++;
		for (int i = 0; i < N; i++){
			if (Graph[v][i] >= 0){
				Indegree[i]--;
				Earliest[i] = max(Earliest[i], Earliest[v] + Graph[v][i]);
			}
			if (Indegree[i] == 0){
				queue[rear++] = i;
				Indegree[i]--;
			}
		}
	}
	int res = 0;
	if (cnt != N)
		return -1;
	else {
		for (int i = 0; i < N; i++){
			if (Outdegree[i] == 0)
				res = max(res, Earliest[i]);
		}
		return res;
	}
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值