您的位置:首页 > 其它

HDU 1285 确定比赛名次

2014-10-12 22:57 316 查看

http://acm.hdu.edu.cn/showproblem.php?pid=1285

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>

using namespace std;

int map[510][510],in[510],d[510];
int n,m;

void toposort(){
    memset(d, 0, sizeof(d));
    for(int i=1; i<=n; i++){
        for(int j=1; j<=n; j++){
            if(!in[j]){
                in[j]--;
                d[i] = j;///roat
                for(int k=1; k<=n; k++){
                    if(map[j][k]){
                        in[k]--;
                    }
                }
                break;
            }
        }
    }
}

int main(){
//    freopen("in.txt", "r", stdin);
    while(scanf("%d%d", &n, &m) != EOF){
        memset(map, 0, sizeof(map));
        memset(in, 0, sizeof(in));
        for(int i=0; i<m; i++){
            int a,b;
            scanf("%d%d", &a,&b);
            if(!map[a][b]){
                map[a][b] = 1;
                in[b]++;
            }
        }
        toposort();
        for(int i=1; i<=n; i++){
            if(i != 1)  cout << " ";
            cout << d[i];
        }
        cout << endl;
    }
    return 0;
}


当输出满足条件且要求输出时字典序小的在前时应该使用优先队列实现的拓扑排序。

<span style="font-size:12px;color:#000000;">#include <queue>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>

using namespace std;

int n,m,map[510][510],into[510];
priority_queue <int, vector<int>, greater<int> > q;

void toposort(){
    for(int i=1; i<=n; i++){
        if(!into[i])    q.push(i);
    }
    int c = 1;
    while(!q.empty()){
        int tmp = q.top();
        q.pop();
        if(c != 1){///打印路径
            cout << " " << tmp;
        }
        else
            cout << tmp;
        c++;
        for(int i=1; i<=n; i++){
            if(!map[tmp][i])    continue;
            into[i]--;
            if(!into[i])
                q.push(i);
        }
    }
}

int main(){
//    freopen("in.txt", "r", stdin);
    while(scanf("%d%d",&n,&m) != EOF){
        memset(map, 0, sizeof(map));
        memset(into, 0, sizeof(into));
        for(int i=0; i<m; i++){
            int a,b;
            scanf("%d%d",&a,&b);
            if(!map[a][b]){///防止有重边
                map[a][b] = 1;
                into[b]++;
            }
        }
        toposort();
        cout << endl;
    }
    return 0;
}
</span>



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: