拓扑排序:hdu 1285 确定比赛名次

这里写图片描述

这里写图片描述

题目大意

n个人进行了m场比赛,每场比赛的胜负给出,求按序号从小到大的顺序输出最终比赛名次

解题思路

1 2表示1->2的有向边,问题转换为输出满足拓扑次序的拓扑序列,就要进行有向无环图的拓扑排列,这里基于邻接表实现拓扑排序。

参考代码+部分注释

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <map>
#include <vector>
#include <queue>
#include <cstring>
#include <cmath>
#include <climits>
#define eps 1e-8
using namespace std;
typedef long long ll;
const int maxx=INT_MAX;
const int maxn = 510;
bool edge[maxn][maxn];//这道题没有权值,bool型即可
int indegree[maxn];   //入度indegree
int n,m;
void Topsort()
{
  for(int i=1;i<=n;i++)//每次循环输出一个顶点
    for(int j=1;j<=n;j++)//遍历所有结点,按从小到大的顺序
        if(indegree[j]==0){
            indegree[j]--;//该节点的入度置为-1,避免重复
            if(i!=n) cout<<j<<" ";
            else cout<<j<<endl;
            for(int k=1;k<=n;k++){
                if(edge[j][k]==true){//把这个点相连的边去掉,相连的顶点入度减一
                    edge[j][k]==false;
                    indegree[k]--;
                }
            }
            break;//找到满足的节点后就跳出,重新扫描图
        }
}
int main()
{
  // freopen("input.txt","r",stdin);
   while(cin>>n>>m){
    memset(edge,false,sizeof(edge));
    memset(indegree,0,sizeof(indegree));
    int from,to;
    for(int i=0;i<m;i++){
        cin>>from>>to;
        if(edge[from][to]==false){//判断是否重边,重边不用indegree++;
            edge[from][to]=true;
            indegree[to]++;
        }
    }
    Topsort();
   }
   return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值