拓扑排序有两种思路,我用的是基于bfs的:
将入度为0的点加入队列,每次处理队列中的点,将该点从图中删除 并 相应减少 该点所能到达点 的 入度,
若有点入度被减为0,则将该点加入队列,一直这样继续直到所有点被处理完(que.size()==0)。
还有一种基于dfs的思路:
L:用于存储拓扑排序后的点的序列
S:所有出度为0的点的集合
for i = 每一个属于S的点
visit(i);
function visit(int v)
{
如果(v点尚未被访问过),则:
visit(所有点e,如果存在边e->v);
将v加入L中 //一定要注意:要在visit完所有点后再进行这一步
否则直接退出函数
}
感觉基于dfs的思路麻烦点,但好像大家都这样用啊。。
HDU1285-注意重边和多组数据。。一开始就坑在这了。
1 #include<iostream> 2 #include<cstdlib> 3 #include<cstdio> 4 #include<cstring> 5 #include<algorithm> 6 #include<queue> 7 #include<vector> 8 using namespace std; 9 priority_queue <int,vector<int>,greater<int> > que; 10 vector <int> ans; 11 bool map[600][600]; 12 int inner[600]; 13 int n,m,a,b; 14 void rclear(){ 15 memset(inner,0,sizeof(inner)); 16 memset(map,0,sizeof(map)); 17 ans.clear(); 18 } 19 int main(){ 20 while(scanf("%d %d",&n,&m)!=EOF){ 21 rclear(); 22 for(int i=0;i<m;i++){ 23 scanf("%d%d",&a,&b); 24 if(!map[a][b]){ 25 map[a][b]=true; 26 inner[b]++; 27 } 28 } 29 for(int i=1;i<=n;i++){ 30 if(!inner[i]) que.push(i); 31 } 32 while(que.size()>0){ 33 int t=que.top();que.pop(); 34 ans.push_back(t); 35 for(int i=1;i<=n;i++){ 36 if(map[t][i]){ 37 map[t][i]=false; 38 inner[i]--; 39 if(!inner[i]) que.push(i); 40 } 41 } 42 } 43 for(int i=0;i<ans.size()-1;i++) printf("%d ",ans[i]); 44 printf("%d\n",ans[ans.size()-1]); 45 } 46 return 0; 47 }
原文:http://www.cnblogs.com/rdzrdz-acm/p/6536992.html