/*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++;
}
}