> 文档中心 > C++ 拓扑排序

C++ 拓扑排序


📋 个人简介

🎉大家好,我是3月份新人榜排名第三的 ༺Blog༒Hacker༻
💬支持我:点赞👍+收藏⭐️+留言📝
🌺格言:༺永做优质༒programmer༻

📣拓扑排序

🍀题目描述
❄️当且仅当一个有向图为有向无环图(DAG)时,才能得到对应于该图的拓扑排序。每一个有向无环图都至少存在一种拓扑排序。

❄️其拓扑排序为其所有结点的一个线性排序。该排序满足这样的条件——对于图中的任意两个结点u和v,若存在一条有向边从u指向v,则在拓扑排序中u一定出现在v前面。

❄️把AOV网(用定点表示活动,用弧表示活动间优先关系的有向图)络中各个顶点按照它们互相之间的优先关系排列成一个线性序列的过程叫做拓扑排序。

☘️输入格式
❄️第一行为整数n和m,用空格隔开;

❄️接下来m行,每行有两个整数u,v,表示一条有向边从u指向v。

☘️输出格式
❄️一行n个整数,之间用空格隔开,表示有向图的拓扑排序。

☄️样例数据

input12 161 21 41 122 34 51 33 53 73 89 129 109 1111 66 810 125 7output1 2 3 4 5 7 9 10 11 6 8 12

🌐数据规模与约定

1<=n,m<=100

💯CODE

#includeusing namespace std;int map[105][105];int n,m;int top[105],rudu[105];void topsort(){  int h,num=0,i,j,k;  for(k=1;k<=n;k++)  {    for(i=1;i<=n;i++)    {      if(rudu[i]==0)      { h=i;    break;  }    }    num++;    top[num]=h;    rudu[h]=-1;    for(j=1;j<=n;j++)    {      if(map[h][j]==1) rudu[j]--;    }   }}int main(){  cin>>n>>m;  int i,j,x,y;  for(i=1;i<=m;i++)  {    cin>>x>>y;    map[x][y]=1;    rudu[y]++;  }  topsort();  for(j=1;j<=n;j++)    cout<<top[j]<<" ";  cout<<endl;  return 0;}

🌺朋友们,点赞是我更新的动力,明天再见,拜拜!!!

在这里插入图片描述