HDU[1285]确定比赛名次 拓扑排序

Posted 哇咔咔咔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDU[1285]确定比赛名次 拓扑排序相关的知识,希望对你有一定的参考价值。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1285

题目大意:某人知道N个队伍M场比赛的胜负结果,要求输出N个队伍的名次(id为第二关键字)。

核心思想:转化为图论问题,进行拓扑排序。步骤1.选定入度为0的点  2.删除该点与关联边  3.重复该过程

代码如下:

//拓扑排序  (1.选入度为0的点。2.删除该点及关联边    3.重复该过程)
#include <iostream>
#include <memory.h>
using namespace std;
int MAP[510][510];//MAP[0][i]为第i个点的入度
int M,N;

void clear(int n){  //删除关联边
    for(int i=1;i<=N;i++){
        if(MAP[n][i]==1){
            MAP[n][i]=0;
            MAP[0][i]--;
        }
    }
    return;
}
void solve(){
    int target;
    int cnt=0;
    bool flag=false;
    for(int i=1;i<=N;i++){
        if(MAP[0][i]==0){
            cnt++;
            cout<<i;
            clear(i);
            MAP[0][i]--;
            i=0;//很关键,
            if(cnt==N)cout<<endl;
            else cout<<" ";
        }
    }
    return ;
}
int main(){
    int x,y,cnt=0;
    while(cin>>N>>M){
        memset(MAP,0,sizeof(MAP));
        while(M--){
            cin>>x>>y;
            if(!MAP[x][y]){
                MAP[x][y]=1;
                MAP[0][y]++;
            }
        }
        for(int i=1;i<=N;i++){
            if(MAP[0][i]==0)cnt++;
        }
        if(cnt==0)MAP[0][1]=0;//如果是环要这样处理,1为起点
        solve();
    }
    return 0;
}

  

以上是关于HDU[1285]确定比赛名次 拓扑排序的主要内容,如果未能解决你的问题,请参考以下文章

HDU-1285 确定比赛名次(拓扑排序)

HDU 1285 确定比赛名次(拓扑排序+优先队列)

[ACM] hdu 1285 确定比赛名次 (拓扑排序)

HDU 1285 确定比赛名次(拓扑排序模板)

HDU-1285-确定比赛名次(拓扑排序)

HDU 1285 确定比赛名次(拓扑排序基础题)