Problem Description
给你n个点,还有m个关系,让你输出拓扑排序后的结果
代码:因为之前学习过拓扑排序,用之前的方法很轻松的A了,后面看到dfs解决的就去学习学习,还看了挺久的才看懂。。
#include<bits/stdc++.h>
using namespace std;
int n, m, t;
int Map[105][105], Pre[105], vis[105];
bool dfs(int u)
{
vis[u] = -1;
for(int v = 1; v <= n; v++)
if(Map[u][v]) {//代表能走
if(vis[v] < 0) return false;//走回了原来的点,回路返回0
else if(!vis[v] && !dfs(v))//找没有走过的点,继续dfs
return false;}
//没有回路,记录下最深的点,也就是入度最多的点。
vis[u] = 1;//标记已经走过
Pre[t--] = u;//倒着存入点,一会儿顺着输出就好了
return true;
}
bool toposort()
{
t = n;
memset(vis, 0, sizeof(vis));
for(int u = 1; u <= n; u++)
if(!vis[u])//如果没有走过,就走一走
if(!dfs(u)) return false;//dfs,如果返回0,代表有回路,所以返回0
return true;
}
int main()
{
int u, v;
while(~scanf("%d %d", &n, &m))
{
memset(Map, 0, sizeof(Map));
if(!n && !m) break;//都是0退出循环
while(m--)
{
scanf("%d %d", &u, &v);
Map[u][v] = 1;//关系用图存起来起来(标记起来)
}
if(toposort()){//拓扑排序
for(int i = 1; i <= n; i++)//输出
{
printf("%d ", Pre[i]);
}
printf("\n");}
else printf("0\n");
}
return 0;
}