拓扑排序
代码
#include <stdio.h>
#include <stdlib.h>
#define N 100
int g[N][N];
int time[N];
int maxtime[N];
int indegree[N];
typedef struct node {
int val;
node* next;
}*grapgnode;
typedef struct graph {
int size;
grapgnode* list;
}*G;
int max(int a, int b) {
if (a > b) {
return a;
}
else {
return b;
}
}
int main()
{
/********** Begin **********/
int n;
printf("请输入课程的个数:");
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
printf("请输入第%d门课程的课程时间:",i);
scanf("%d", &time[i]);
}
//构建邻接表
G g = (G)malloc(sizeof(graph));
g->size = n;
g->list = (grapgnode*)malloc(n * sizeof(node) + 1);
for (int i = 1; i <= n; i++) {
g->list[i] = (grapgnode)malloc(sizeof(node));
g->list[i]->next = NULL;
}
//初始化入度数组 并赋值
printf("请输入A门课程要在B门之前开课,输入-1 -1结束\n");
int u, v;
while (1) {
printf("A B:");
scanf("%d%d", &u, &v);
if (u == -1 && v == -1) {
break;
}
indegree[v]++;
grapgnode node = (grapgnode)malloc(sizeof(node));
node->val = v;
node->next = g->list[u]->next;
g->list[u]->next = node;
}
int target;
printf("查询编号为几的课程的最小开启时间:");
scanf("%d", &target);
//用队列保存入度为0的点
int que[1000];
int head = 0, tail = 0;
for (int i = 1; i <= n; i++) {
if (indegree[i] == 0) {
que[tail++] = i;
if (i == target) {
goto found;
}
}
}
while (head < tail) {
int cur = que[head];
grapgnode curnode = g->list[cur]->next;
while (curnode) {
indegree[curnode->val]--;
maxtime[curnode->val] = max(maxtime[cur] + time[cur],maxtime[curnode->val]);
if (indegree[curnode->val] == 0) {
que[tail++] = curnode->val;
}
curnode = curnode->next;
}
head++;
}
goto found;
//
/********** End **********/
return 0;
found:
printf("最小时间为:%d", maxtime[target]);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理