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

本文解析了HDU 1285比赛问题,通过将队伍间的胜负关系转换为图论问题,并利用拓扑排序算法求解各队伍排名。文章提供了完整的C++代码实现。

题目链接: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;
}

  

转载于:https://www.cnblogs.com/G-M-WuJieMatrix/p/6919302.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值