题目:http://poj.org/problem?id=2367
拓扑排序要求:无环有向图
算法思路:
1.找出入度为0的点,输出
2.把找到的入度为零的点删除,并把与这个点相连的边删除
3.重复1,2步直到输出所有点
实现:
维护一个in[i]数组表示点i的入度
flag[]标记是否已输出过
vector bian[max] 用邻接表存图
#include <iostream>
#include <cstdio>
#include <vector>
#include <list>
#include <string.h>
#include <queue>
using namespace std;
int in[105],flag[105];
vector<int> bian[105];
queue<int> sum;
int main()
{
int n;
cin>>n;
memset(in, 0, sizeof(in));
memset(flag, 0, sizeof(flag));
for (int i = 1; i <= n; i ++)
{
int point;
while (cin>>point && point)
{
bian[i].push_back(point);
in[point] ++;
}
}
while (sum.size() != n)
{
for (int i=1; i <= n; i++)
{
if (in[i] == 0 && flag[i] == 0)
{
sum.push(i);
flag[i] = 1;
for(int ix=0; ix<bian[i].size(); ++ix)
{
in[bian[i][ix]] --;
}
break;
}
}
}
for (int i = 0; i < n-1; i ++)
{
cout<<sum.front()<<" ";
sum.pop();
}
cout<<sum.front()<<endl;
sum.pop();
return 0;
}
ps:好久没更博了,一定要好好坚持吖~