拓扑排序

拓扑排序就是根据给出的集合上的偏序关系得到该集合上的一个全序。

进行拓扑排序可以根据入度求出:不断地选择入度为0的结点,并且删除该结点以及以该结点为起点的弧。如果在过程中所有的结点入度均大于0,则证明无法进行拓扑排序。

int n; //结点数
int m; //偏序数
void TopoSort()
{
   memset(G,0,sizeof(G));
   memset(in,0,sizeof(in));
   int u,v;
   for(int i=0; i<m; i++)
   {
       scanf("%d%d",&u,&v);
       G[u][v] = 1;
       in[v]++;
   }
   /*遍历一次,找出一个结点*/
   for(int i=1; i<=n; i++)
     for(int j=1; j<=n; j++)
     {
        if(!in[j])    
        {
            printf("%d ",j);
            in[j]--;
            for(int k=1; j<=n ;k++)
                if(G[j][k]) in[k]--;
            break;
        }
     }
}

也可以直接利用dfs搜索。

bool dfs(int u)
{
    c[u] = -1;   //正在访问
    for(int v=1; v<=n; v++)
        if(G[u][v])
        {
            if(c[v]<0) return false;
            if(!c[v] && !dfs(v)) return false;
        }
    c[u] = 1;  //已经访问
    topo[--t] = u; //逆序
    return true;
}
bool toposort()
{
    t = n;
    for(int u=1; u<=n; u++)
      if(!c[u])
        if(!dfs(u)) return false;
    return true;
}


 


bool dfs(int u)
{
    c[u] = -1;   //正在访问
    for(int v=1; v<=n; v++)
        if(G[u][v])
        {
            if(c[v]<0) return false;
            if(!c[v] && !dfs(v)) return false;
        }
    c[u] = 1;  //已经访问
    topo[--t] = u; //逆序
    return true;
}
bool toposort()
{
    t = n;
    for(int u=1; u<=n; u++)
      if(!c[u])
        if(!dfs(u)) return false;
    return true;
}


 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值