zoukankan      html  css  js  c++  java
  • HDU1285_确定比赛名次

    HDU1285_确定比赛名次

    题目大意

    有 n 个队伍, 只知道 m 条关于两支队伍之间胜负的关系. 求 排名. 排名不唯一, 此时输出编号较小的队伍的排名. 输入数据保证有一个符合要求的排名.

    思路1

    最开始想到的是 使用队列进行排序 , 但是 传统地 使用队列, 并不能解决这道问题. 所以需要 理解拓扑排序原理 后, 写一个 O(n^2) 的循环解决这道题.

    但是, 此题有一个 可能一组边会被输入多次, 所以每次在入度的数组 inDeg 中, 每次 减小 的值是 edge[loc][j]

    代码

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #define MAXN 550
    using namespace std;
    int inDeg[MAXN];
    int edge[MAXN][MAXN];
    int main(){
        int nVertex, nEdge;
        while(scanf("%d%d", &nVertex, &nEdge) != EOF){
            memset(inDeg, 0, sizeof(inDeg));
            memset(edge, 0, sizeof(edge));
            for(int i = 0; i < nEdge; i++){
                int a, b;
                scanf("%d%d", &a, &b);
                edge[a][b]++;
                inDeg[b]++;
            }
            for(int i = 1; i <= nVertex; ++i){
                int loc;
                for(loc = 1; loc <= nVertex && inDeg[loc] != 0; ++loc);
                inDeg[loc]--;
                if(i != 1)
                    printf(" ");
                printf("%d", loc);
    
                for(int j = 1; j <= nVertex; ++j){
                    if(edge[loc][j] == 0)
                        continue;
                    inDeg[j] -= edge[loc][j];
                }
            }
            printf("
    ");
        }
        return 0;
    }
    
    

    思路2

    使用优先队列, 开头将每一个 入度为0 的点压进队列, 因为是 priority_queue<int, vector, greater >, 所以每次就是最小的点在最前, 解决了多个解的问题.

    代码

    #include <cstdio>
    #include <queue>
    #include <vector>
    #include <cstring>
    #define MAXN 550
    using namespace std;
    int nVertex, nEdge;
    int edge[MAXN][MAXN];
    int inDeg[MAXN];
    void topOrder(){
        priority_queue<int, vector<int>, greater<int> >que;
        // queue<int> que;
        for(int i = 1; i <= nVertex; i++){
            if(inDeg[i] == 0)
                que.push(i);
        }
        int flag = 0;
        while(!que.empty()){
            int front = que.top();
            que.pop();
    
            if(flag) printf(" ");
            printf("%d", front);
            flag = 1;
    
            for(int i = 1; i <= nVertex; i++){
                if(edge[front][i] == 0)
                    continue;
                inDeg[i] -= edge[front][i];
                if(inDeg[i] == 0)
                    que.push(i);
            }
        }
    }
    int main(){
        while(scanf("%d %d", &nVertex, &nEdge) != EOF){
            memset(edge, 0, sizeof(edge));
            memset(inDeg, 0, sizeof(inDeg));
            for(int i = 0; i < nEdge; i++){
                int a, b;
                scanf("%d %d", &a, &b);
                edge[a][b]++;
                inDeg[b]++;
            }
            topOrder();
            printf("
    ");
        }
        return 0;
    }
    
    
  • 相关阅读:
    How to load custom styles at runtime (不会翻译,只有抄了 )
    更多FMK 的还是看万一的吧
    Custom Grid Columns
    样式和说明文档
    LiveBindings --- 把对象之间的属性绑定起来
    LiveBindings如何绑定一个对象(转)
    Delphi LiveBinds组件
    记录一偏,因为我不会翻译,
    Delphi XE4 For IOS之部署问题
    Delphi XE5 android 捕获几个事件
  • 原文地址:https://www.cnblogs.com/1pha/p/7815886.html
Copyright © 2011-2022 走看看