#include<cstdio>
#include<cstring>
const int maxn = 1000;
int n, m, G[maxn][maxn], c[maxn], topo[maxn], t;
//是否存在从u出发的拓扑序。如果有,将其存入topo中,返回true;否则返回false
bool dfs(int u){
c[u] = -1; //访问u,并且未退出
for(int v = 0; v < n; v++)
if(G[u][v]) { //访问u的邻接顶点
if(c[v]<0) return false; //邻接顶点已访问,并且未退出,说明存在有向环,不存在拓扑序
else if(!c[v] && !dfs(v)) return false; //邻接顶点v从未访问过,并且不存在从v出发的拓扑序
}
c[u] = 1; //标记u访问结束,避免同一顶点被多次访问
topo[--t]=u; //将u加入当前拓扑序的首部
return true; //存在从u开始的拓扑序
}
bool toposort(){
t = n;
memset(c, 0, sizeof(c));
for(int u = 0; u < n; u++)
if(!c[u] && !dfs(u)) return false; //只要有一个顶点不存在拓扑序,就返回false
return true;
}
int main() {
while(scanf("%d%d", &n, &m) == 2 && n) {
memset(G, 0, sizeof(G));
for(int i = 0; i < m; i++) {
int u, v;
scanf("%d%d", &u, &v); u--; v--; //将顶点重新标号为数组下标
G[u][v] = 1; //存在从u指向v的边
}
if(toposort()) {
for(int i = 0; i < n-1; i++)
printf("%d ", topo[i]+1);
printf("%d\n", topo[n-1]+1);
}
else
printf("No\n"); // 题目没说无解输出什么,应该是保证有解吧
}
}
01-09
05-06
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交