深度优先拓扑排序原理,拓扑排序概念

  深度优先拓扑排序原理,拓扑排序概念

  拓扑排序1:

  定义

  有向无环图(DAG)G的拓扑排序是将G中的所有顶点排列成一个线性序列,使得图中任意一对顶点U和V,如果U和V都属于E(G),那么U在线性序列中出现在V之前。

  通常,这样的线性序列称为满足拓扑序的序列,或简称为拓扑序列。

  注意:

  1)只有有向无环图才有拓扑序列:

  2)对于一个DAG,可能有多个拓扑序列。

  HDU 4857逃脱

  解决方案:使用优先级队列和拓扑排序的属性:

  代码:

  #包括cstdio

  #包括cstring

  #包括队列

  #包含矢量

  使用命名空间std

  #定义maxn 300005

  int in[maxn];//表示渗透程度。

  vector int vec[maxn];

  int vis[maxn];

  int num[maxn];

  int n,m;

  无效输入()

  {

  memset(vec,0,sizeof(vec));

  memset(in,0,sizeof(in));

  memset(vis,0,sizeof(vis));

  int u,v;

  for(int I=0;我我)

  {

  scanf(%d %d ,u,

  vec[v]。push _ back(u);

  in[u];

  }

  }

  void拓扑排序()

  {

  优先级队列int

  int CNT=0;

  for(int I=1;我我)

  {

  if(in[i]==0)

  { q . push(I);

  //vis[CNT]=I;

  //num[CNT]=I;

  //CNT;

  }

  }

  而(!q.empty())

  {

  int x=q . top();

  q . pop();

  vis[CNT]=x;

  for(int k=0;k vec[x]。size();k)

  {

  int v=vec[x][k];

  在[v]-;

  if(in[v]==0)

  {

  //vis[CNT]=v;

  //num[CNT]=v;

  q . push(v);

  //CNT;

  }

  }

  }

  for(int I=n-1;我我-)

  {

  如果(我!=0)

  printf(%d ,vis[I]);

  其他

  {

  printf(%d\n ,vis[I]);

  }

  }

  //printf(%d %d ,vis[4],num[3]);

  //printf( \ n );

  }

  int main()

  {

  int t;

  scanf(%d ,

  while(t -)

  {

  scanf(%d %d ,n,

  input();

  toposort();

  }

  }

  版权归作者所有:原创作品来自博主mb5c5a77ee6227c,转载请联系作者授权,否则将追究法律责任。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: