UVa10305 - Ordering Tasks拓扑排序 天书啊

搜到一个代码 我尼玛 c语言 顿时感到从来没有的亲切

写着写着发现什么语言都看不懂啊 泪奔

如若有人看到此篇 教导一二 或仅留几句到此一游 我会尤为感激 代码没白抄

#include<stdio.h>
#include<string.h>
int n, st[110], top, G[110][110], vis[110];
void dfs(int u)
{
    int v;
    vis[u] = 1;
    for(v = 1; v <= n; v++)
        if(G[u][v] && !vis[v])
            dfs(v);
    st[--top] = u;
}
int main()
{
    int i,j,k,m,a,b;
    while(1)
    {
        scanf("%d%d", &n, &m);
        if(n == 0)
            break;
        memset(G, 0, sizeof(G));
        for(i=0; i <m; i++)
        {
            scanf("%d%d", &a, &b);
            G[a][b] = 1;
        }
        memset(vis, 0, sizeof(vis));
        top = n;
        for(i=1; i <= n;i++)
            if(!vis[i])
                dfs(i);
        for(i=0; i <n; i++)
        {
            if(i)
                printf(" ");
            printf("%d", st[i]);
        }
        printf("\n");
    }
    return 0;
}

下面是暴力的程序

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int edge[105][105];
int list[105];
int used[105];
int main()
{
    int n,m,a,b;
    while( scanf("%d%d", &n, &m) && n) {
        for(int i = 1; i <= n;  ++ i){
            list[i] = 0;
            used[i] = 0;
        }
        memset(edge, 0, sizeof(edge));
        for(int i = 1; i <= m; ++i){
            scanf("%d%d", &a, &b);
            edge[a][b] = 1;
            list[b] ++;
        }
        for(int i = 1; i <= n; ++i){
            int now = 0;
            for(int j = 1; j <= n; ++j)
            if( !used[j] && !list[j]) {
                used[j] = 1;
                now = j; break;
            }

            for(int j =1; j <= n; ++j)
                if(edge[now][j]) list[j]--;

            printf("%d", now);
            if( i < n ) printf(" ");
            else printf("\n");
        }
    }
    return 0;
}

    原文作者:拓扑排序
    原文地址: https://blog.csdn.net/a197p/article/details/43638989
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞