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;
}

  

posted @ 2017-05-29 23:12  哇咔咔咔  阅读(210)  评论(0编辑  收藏  举报