18734 拓扑排序 SCAU 数据结构 笔记 实验

/*18734 学习
时间限制:1000MS  代码长度限制:10KB
提交次数:0 通过次数:0

题型: 编程题   语言: 不限定
Description

在经历.....之后,你打算好好学习下计算机专业的课程,避免面试过程中的各种尴尬场面。
计算机的专业课程间既有循序渐进的特点,相互间也存在着依赖关系(似乎其他专业也是这样......)。
现在给你n门课程和m个课程间关系,请给出一个有效的学习次序。
注意可能存在多门课程不依赖任何其他课程



输入格式
第一行有2个数,分别为课程数n和关系数m。     (1=<n<=20) (1=<m<=30)
接下来有m行,每一行有2个整数a和b,表示课程b依赖于课程a。(1=<a,b<=n)


输出格式
仅一行,一个整数序列,代表课程学习次序。
为确保输出唯一性,同等条件下,编号小的在排在前面。


输入样例
6 8
1 2
1 3
1 4
3 2
3 5
4 5
6 4
6 5


输出样例
1 3 2 6 4 5

	1	2	3	4	5	6
1	0	1	1	1	0	0
2	0	0	0	0	0	0
3	0	1	0	0	1	0
4	0	0	0	0	1	0
5	0	0	0	0	0	0
6	0	0	0	1	1	0

列全0 就可以输出并且要删除他所在的行的边 循环几次就可以了

这个只能用来应付考试,时间和空间效率都很差

提示
图片来源于今日头条。
*/
#include<stdio.h>
int graph[20][20] = { 0 }; //存放点与点之间的关系
int list[20] = { 0 };//标记这个点有没有输出过

int main()
{
    int n, m;
    scanf("%d %d", &n, &m);
    int a, b;
    for (int i = 0; i < m; i++)
    {
        scanf("%d %d", &a, &b);
        graph[a][b] = 1;
    }//常规的接收
    int i = 1;//辅助列扫描
    int count = 1;//统计输出点个数
    while (count<=n)//点没有全部输出都要继续循环
    {
        int flag = 1;
        for (int j = 1; j <= n; j++)
        {
            if (graph[j][i])
            {
                flag = 0;
                break;
            }
        }//判断列是不是全为0
        if (flag&&list[i]!=1)  //列全0且没有被输出过
        {
            printf("%d ", i);
            list[i] = 1;//输出并且做标记
            for (int j = 1; j <= n; j++)
            {
                graph[i][j] = { 0 };
            }//i他所在的行的边全部置为0 相当于删除了
            i = 0;//回到起点 这样编号小的在排在前面。
            count++;
        }
        i++;
    }
}


 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值