码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2017-05-30 00:10:42      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:ios   get   ems   cout   problem   logs   memset   sizeof   while   

题目链接: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]确定比赛名次 拓扑排序

标签:ios   get   ems   cout   problem   logs   memset   sizeof   while   

原文地址:http://www.cnblogs.com/G-M-WuJieMatrix/p/6919302.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!