题目大意
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;
}