拓扑排序模板

来源:互联网 发布:淘宝地址在哪里添加 编辑:程序博客网 时间:2024/05/21 15:47

两种类型依情况使用,多数使用第二种dfs

#include <iostream>  using namespace std;  int map[502][502], indegree[502], m, n, pur[502];  void topsort()  {      int i, j, k=1;      for(i=1; i<=n; i++)      {          for(j=1; j<=n; j++)          {              if(indegree[j]==0)              {                  indegree[j]--;                  pur[k++] = j;                  for(int x=1; x<=n; x++)                      if(map[j][x])                          indegree[x]--;                  break;              }        }              if(j>n)              {                  cout<<"存在环"<<endl;                  return ;              }       }  }  void main()  {      int i, j;      while(cin>>n>>m)      {          memset(map,0,sizeof(map));          memset(indegree,0,sizeof(indegree));          int a, b;          for(i=1; i<=m; i++)          {              cin>>a>>b;              if(!map[a][b])              {                  map[a][b] = 1;                  indegree[b]++;              }          }          topsort();          for(i=1; i<=n; i++)              if(i!=n)                  cout<<pur[i]<<" ";              else                  cout<<pur[i]<<endl;      }  }  
vector<int>g[N];//邻接表存储int vis[N],topo[N],cnt;bool dfs(int u){    vis[u] = -1;//-1用来表示顶点u正在访问    for(int i = 0 ; i < g[u].size() ; i ++)    {        if(vis[g[u][i]] == -1)//表示这个点进入了两次,肯定出现了环            return false;        else if(vis[g[u][i]] == 0)        {            dfs(g[u][i]);        }    }    vis[u] = 1;    topo[cnt++] = u;//放到结果数组里,输出的时候记得倒序输出,(回溯的原因)    return true;}bool toposort(int n){    memset(vis,0,sizeof(vis));    for(int i = 1 ; i <= n ; i ++)    {        if(!vis[i])        {            if(!dfs(i)) return false;//huan        }    }    return true;}
0 0
原创粉丝点击