RoNgDaZhOnG

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

 拓扑排序有两种思路,我用的是基于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 }

 

posted on 2017-03-12 09:26  学无止境-1980  阅读(103)  评论(0编辑  收藏  举报