深度优先拓扑排序原理,拓扑排序概念
拓扑排序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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。