简单的拓扑排序应用
采用邻接矩阵:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
#define maxn 505
int map[maxn][maxn];
int indegree[maxn], n, m;
int main()
{
while (cin >> n >> m)
{
memset(map, 0, sizeof(map));
memset(indegree, 0, sizeof(indegree));
while (m--)
{
int a, b;
cin >> a >> b;
if (!map[a][b])
{
map[a][b] = 1;
++ indegree[b];
}
}
for (int i=1; i<=n; ++i)
{
for (int j=1; j<=n; ++j)
{
if (indegree[j]==0)
{
indegree[j] = -1;
if (i==1)
cout << j;
else
cout << " " << j;
for (int k=1; k<=n; ++k)
if (map[j][k])
{
map[j][k] = 0;
-- indegree[k];
}
break;
}
}
}
cout << endl;
}
return 0;
}
采用邻接链表,使用优先队列是序列有一定的顺序。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
#define maxn 10000
struct node
{
int begin, end;
}edge[maxn];
int head[maxn], indegree[maxn];
/**
1. 3->5
2. 3->6
3. 3->7
edge[1].to = 5;
edge[1].begin = head[3] = -1;
head[3] = 1;
edge[2].to = 6;
edge[2].begin = head[3] = 1;
head[3] = 2;
edge[3].to = 7;
edge[3].begin = head[3] = 2;
head[3] = 3;
*/
int ans[maxn], cnt, n, m;
class cmp
{
public :
bool operator()(int x, int y)
{
return x>y;
}
};
int main()
{
while (cin >> n >> m)
{
memset(head, -1, sizeof(head));
memset(indegree, 0, sizeof(indegree));
for (int i=1; i<=m; ++i)
{
int a, b;
cin >> a >> b;
edge[i].end = b;
edge[i].begin = head[a];
head[a] = i;
indegree[b] ++;
}
priority_queue<int, vector<int>, cmp> pq;
for (int i=1; i<=n; ++i)
{
if (!indegree[i])
pq.push(i);
}
cnt = 0;
while (!pq.empty())
{
int temp = pq.top();
pq.pop();
ans[cnt++] = temp;
for (int i=head[temp]; i!=-1; i=edge[i].begin)
{
indegree[edge[i].end] --;
if (!indegree[edge[i].end])
pq.push(edge[i].end);
}
}
for (int i=0; i<cnt; ++i)
i==0 ? cout<<ans[i] : cout<<" "<<ans[i];
printf("\n");
}
return 0;
}