拓扑排序模板题。
dfs型代码:
#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
#define maxn 105
int c[maxn], g[maxn][maxn];
int topo[maxn], t, n;
bool dfs(int u)
{
c[u] = -1;
for(int v = 0; v < n; v++)
{
if(g[u][v])
{
if(c[v] < 0) return false;
else if(!c[v] && !dfs(v)) return false;
}
}
c[u] = 1; topo[--t] = u;
return true;
}
bool toposort()
{
t = n;
memset(c, 0, sizeof(c));
for(int u = 0; u < n; u++)
{
if(!c[u])
{
if(!dfs(u)) return false;
}
}
return true;
}
int main()
{
int m;
while(cin >> n >> m && m+n)
{
memset(g, 0, sizeof(g));
for(int i = 1; i <= m; i++)
{
int a, b; cin >> a >> b;
g[a-1][b-1] = 1;
}
toposort();
for(int i = 0; i < n; i++)
{
if(!i) cout << topo[i]+1;
else cout << " " << topo[i]+1;
}
cout << endl;
}
return 0;
}
队列型:
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int maxn = 105;
int n, m;
int indegree[maxn] = {0}, gragh[maxn][maxn], res[maxn];
void toposort()
{
queue <int> q;
int cnt = 0;
for (int i = 0; i < n; i++)
if (indegree[i] == 0)
q.push(i);
while (!q.empty())
{
int tmp = q.front();
q.pop();
res[cnt++] = tmp;
for (int i = 0; i < n; i++)
if (gragh[tmp][i] != 0)
if (--indegree[i] == 0)
q.push(i);
}
printf("%d", res[0] + 1);
for (int i = 1; i < cnt; i++)
printf(" %d", res[i] + 1);
printf("\n");
}
int main()
{
while (scanf("%d%d", &n, &m) && (n || m))
{
memset(gragh, 0, sizeof(gragh));
memset(indegree, 0, sizeof(indegree));
int a, b;
for (int i = 0; i < m; i++)
{
scanf("%d%d", &a, &b);
gragh[a-1][b-1] = 1;
indegree[b-1]++;
}
toposort();
}
return 0;
}