HDU 1285 确定比赛名次

拓扑排序裸题。

唯一要考虑的是如何保证字典序输出结果。

这里用最简单的方法,每次都将队列里的点排序即可。

#include <stdio.h>
#include <queue>
#include <algorithm>
#include <vector>
using namespace std;

int n , m , a , b , in[600];
vector <int> g[600];

void init(){
    for(int i=0;i<=500;i++) g[i].clear();
    for(int i=0;i<=500;i++) in[i] = 0;
}
int c = 0 , C=0;
int at[1000] , fn[1000];

void topo(){
    queue<int> q;
    C = 0;
    for(int i=1;i<=n;i++) if(in[i] == 0) q.push(i);
    while(!q.empty()){
        int x = fn[++C] = q.front();
        q.pop();
        c = 0;
        
        for(int i=0;i<g[x].size();i++) {
            int v = g[x][i];
            if(in[v] > 0) in[v]--;
            if(in[v] == 0) q.push(v);
        }while(!q.empty()) at[++c]=q.front(),q.pop();
        sort(at+1,at+1+c);
        for(int i=1;i<=c;i++) q.push(at[i]);
    }
    for(int i=1;i<=C;i++) printf("%d%c",fn[i],i==C?'\n':' ');
    return ;
    
}

int main() {
    while(~scanf("%d %d",&n,&m)){
        init();
        while(m--){
            scanf("%d %d",&a,&b);
            g[a].push_back(b);
            in[b] ++;
        }
        topo();
    }
    return 0;
}
View Code

 

posted on 2013-12-02 13:14  从此以后  阅读(199)  评论(0)    收藏  举报