拓扑排序 topsort()

/**
    不知道topsort 排序有没有专门的算法,不过今天贴这个挺简单的,也好理解

    拓扑排序就是,给出一系列的需求关系,求一个序列,这个序列完全满足这里面
    的全部需求,直到结束

    如:你想要认识 奥巴马 必须要认识 F 和 D, 你要认识 D 必须认识 B,
        可是你要认识B 又得靠 A 和 C,当然认识 F 也得通过C

    当然这些关系就是
        A->B
        C->B
        C->F
        B->D
        D->F
        F->奥巴马
    所以你要认识奥巴马可以 按照这个序列 A->C->B->D->F->奥巴马
    这就是拓扑排序

    刚刚又做了下POJ 1094 终于过了,以前看别人代码用到floyed 传递闭包,
    其实不用也可以的,考虑的情况太多,ACM 真是太伤脑筋

*/

int map[MAX][MAX];
char path[MAX];
//map中记录各顶点的关系, 结点为MAX, path 记录拓扑排序结果

bool topsort() {
    int i, j, k, d[Max];
    for (i=0; i<n; i++)
        for (d[i]=j=0; j<n; j++)
            d[i] += map[j][i];       //计算第i 个结点入度

    for (k=0; k<n; k++) {
        for (i=0; i<n && d[i]; i++); //寻找入度为零的结点

        if (i == n) return false;    //有环,没找到返回不存在

        for (d[i]=-1, j=0; j<n; j++) //去掉i 结点,维护i 子结点
            d[j] -= map[i][j];

        path[k] = i;                 //记录拓扑序列
    }
    return true;                     //如存在返回真
}

int main() {
    int n;
    /**
        设有n 个点并建好图
        注意 :memset(map, 0, sizeof (map));
        添边 (u, v) 即 map[u][v] = 1;
    */
    if (topsort()) {
        for (int i=0; i<n; i++)
            printf("%c ", path[i]);
    }
    else
        printf("不存在 ");

    return 0;
}

/**
    伤不起,伤不起,伤不起,睡觉,晚安
*/

收藏于 2012-01-11

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值