#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;
}
}08-图8 How Long Does It Take
最新推荐文章于 2019-05-15 19:08:05 发布
本文介绍了一个基于最早时间的课程调度算法实现。通过定义各种数组来记录节点之间的关系和时间信息,利用队列进行广度优先搜索,实现了课程的最早完成时间计算。特别地,该算法能够处理有向图中顶点的入度、出度,并计算每个任务的最早开始时间。
320

被折叠的 条评论
为什么被折叠?



