这篇文章主要是提供模板…………
基本思路很简单,看看下面的几个步骤就会了……
(1)从网中选择一个入度为零的顶点输出;
(2)删除该顶点及其于该点有关的所有边;
(3)是否还有入度为零的顶点?若有,执行(1),否则结束。
算法实现:(已使用STL)
用vector数组存储图,然后用d数组来存储每个点的入度,先遍历一次,找出入度为0的点,把该点入栈
基本思路很简单,看看下面的几个步骤就会了……
(1)从网中选择一个入度为零的顶点输出;
(2)删除该顶点及其于该点有关的所有边;
(3)是否还有入度为零的顶点?若有,执行(1),否则结束。
算法实现:(已使用STL)
用vector数组存储图,然后用d数组来存储每个点的入度,先遍历一次,找出入度为0的点,把该点入栈
进入循环,直到循环为空为止
OK,上代码:
#include<iostream>
#include<vector>
#include<cstdio>
#include<stack>
#include<cstring>
using namespace std;
vector<int>g[105];
int M,N,d[105];
bool vis[105] = {false};
void toposort()
{
stack<int>sta;
for (int i=0;i<N;i++)
if (!vis[i] and d[i]==0)//如果该点没有被访问过,且入度为0
vis[i]=true,sta.push(i);//标记一下,加入栈
while(!sta.empty()){
int nod=sta.top();sta.pop();
cout<<nod<<" ";
for(int i=0;i<g[nod].size();i++){
int u=g[nod][i];//将前驱为0的节点,对应的边去掉,对应点的入度减一
d[u]--;
}
for (int i=0;i<N;i++){//循环里面再做一次相同的操作
if (!vis[i] and d[i]==0)
vis[i]=true,sta.push(i);
}
}
// for(int i = 0; i < N; i++){//查看是否有回路
// if(!vis[i]) return false;
// }
// return true;
}
int main()
{
cin>>N>>M;
for(int i = 0; i < N+1; i++) g[i].clear();
for(int i = 0; i < M; i++)
{
int a,b;
cin>>a>>b;
d[b]++;
g[a].push_back(b);
}
toposort();
return 0;
}
END