UVA 10305

来源:互联网 发布:星星知我心第二部全集 编辑:程序博客网 时间:2024/06/05 00:37

题目大意:有1~n个编号,给你m个二元关系,表示前者小于后者,请你给出一个满足所有二元关系的排序。

解题思路:拓扑排序问题,不包含dfs,小紫中有,但感觉难理解,查了一些大概理解一点。将问题转化为n个点,每个二元关系表示有指向的线,得到的图,先将入度为0的输出,然后将入度为0的编号与其他二元关系解除,同时将与入度为0的存在关系的编号的入度-1。循环输出。两个点,map[a][b]表示a与b有无(1或0)元关系,inde[a]表示a的入度。

ac代码:

#include <iostream>#include <cstring>#include <set>using namespace std;int main(){set <int>se; int n, m, map[105][105], inde[105], a, b;while (scanf("%d%d", &n, &m)!=EOF){if (!n && !m)break;memset(inde, 0, sizeof(inde));memset(map, 0, sizeof(map));for (int i=0; i<m; i++){scanf("%d%d", &a, &b);inde[b]++;map[a][b] = 1;}for (int i=1; i<=n; i++)for (int j=1; j<=n; j++)if (!inde[j] && !se.count(j)){se.insert(j);if (se.size() == n)printf("%d\n", j);elseprintf("%d ", j);for (int k=1; k<=n; k++)if (map[j][k]){map[j][k] = 0;inde[k]--;}}se.clear();}return 0;}

ac代码:

#include <iostream>#include <cstring>using namespace std;int c[1005], topo[1005], n, m;int G[1005][1005], t, t1, t2;bool dfs(int u){c[u] = -1;for (int i=1; i<=n; i++)if (G[u][i]){if (c[i] < 0)return 0;else if (!c[i] && !dfs(i))return 0;}c[u] = 1, topo[--t] = u;return 1;} bool toposort(){t = n;memset(c, 0, sizeof(c));for (int i=1; i<=n; i++)if (!c[i] && !dfs(i))return 0;return 1;}int main(){while (scanf("%d%d", &n, &m) != EOF && n+m){memset(G, 0, sizeof(G));for (int i=0; i<m; i++){scanf("%d%d", &t1, &t2);G[t1][t2] = 1;}if (toposort())for (int i=0; i<n; i++)printf(i==n-1?"%d\n":"%d ", topo[i]);}return 0;}