拓扑排序。

CODE:

 

 

#include <iostream>
using namespace std;

const int SIZE = 510;

int topo[SIZE], ind[SIZE];
int G[SIZE][SIZE];
int n, m;

int toposort()
{
    for(int i = 1; i <= n; i++)
    {
        int u;
        for(u = 1; u <= n; u++)
            if(!ind[u]) break;
        if(u > n) return 0;
        topo[i] = u; ind[u]--;
        for(int v = 1; v <= n; v++)
          if(G[u][v]) ind[v]--;
    }
    return 1;
}

void init()
{
    memset(ind, 0sizeof(ind));
    memset(G, 0sizeof(G));
}

int main()
{
    while(~scanf("%d%d", &n, &m))
    {
        init();
        while(m--)
        {
            int u, v;
            scanf("%d%d", &u, &v);
            if(G[u][v] == 0)           //去重边
            {
                G[u][v] = 1;
                ind[v]++;
            }
        }
        toposort();
        for(int i = 1; i <= n; i++)
        {
            printf(i!=n?"%d ":"%d\n", topo[i]);
        }
    }
    return 0;
}

 

posted on 2012-09-17 22:15  有间博客  阅读(190)  评论(0编辑  收藏  举报