Hdu 1285 确定比赛名次

拓扑排序。

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;
}

 

你可能感兴趣的:(HDU)