拓扑排序 模板

#include<iostream>
#include<cstdio>
#include <cctype>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
#include<cmath>
#include<set>
#include<vector>
#include<stack>
#include<queue>
#include<map>
using namespace std;
#define ll long long
#define mem(a,x) memset(a,x,sizeof(a))
#define se second
#define fi first
const ll mod=998244353;
const int INF= 0x3f3f3f3f;
const int N=2e5+5;

int n,m;
vector<int>e[105];
vector<int>ans;
int in[105];
queue<int>q;

void bfs()
{
    while (!q.empty()) q.pop();

    for(int i=1;i<=n;i++)  //n  节点的总数
        if(in[i]==0)  q.push(i);//将入度为0的点入队列
    while(!q.empty())
    {
        int p=q.front(); q.pop(); // 选一个入度为0的点,出队列
        ans.push_back(p);
        for(int i=0;i<e[p].size();i++)
        {
            int y=e[p][i];
            in[y]--;
            if(in[y]==0)
                q.push(y);
        }
    }

}
int main()
{
    while(cin>>n>>m && (n ||m) )
    {
        mem(in,0);
        mem(e,0);
        ans.clear();

        int a,b;
        for(int i=1;i<=m;i++){
            scanf("%d%d",&a,&b);
            e[a].push_back(b);
            in[b]++;
        }
        bfs();

        for(int i=0;i<ans.size()-1;i++)
            printf("%d ",ans[i] );
        cout<<ans[ans.size()-1]<<endl;
    }
}

原文地址:https://www.cnblogs.com/thunder-110/p/10325293.html

时间: 2024-08-07 10:39:51

拓扑排序 模板的相关文章

拓扑排序 --- 模板题

确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 10536    Accepted Submission(s): 4120 Problem Description 有 N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排 名,但现在裁判委员会不能

HDU 1285 确定比赛名次(拓扑排序模板)

题意还是比较容易理解的,关键要看到后面的:合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前: 思路:这道题就是拓扑排序的经典应用了,用队列做的考虑优先编号小的出队就可以了. 拓扑排序: 拓扑排序是对有向无回路图(DAG)顶点的一种排序,它使得如果存在从u到v的有向路径,那么满足序列中u在v前. 所以我们的算法可以描述为这样一个过程: 1.找到整个图中所有的度为0的点,将这些点压进队列(栈)中 2.从队列(栈)中取出一点,输出,将该点及它的边删除,找到它所指向的点,如果改点是一个原点(删

拓扑排序模板

拓扑排序是对ADG(有向无环图进行线性排序) 模板: 队列实现 #include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; int indegree[100]; queue<int> q; int n,m; bool map[100][100]; int a[100]; int topo(int n) { int cnt =

『拓扑排序』拓扑排序模板

拓扑排序学习前提须知 拓扑排序是对于一个图的所有节点进行排序,要求排序完后没有一个节点指向它前面的节点,那么这样我们就会得到一个拓扑排序后的数组,我们从后往前扫通过某种计算就能够得到从某一个点开始最多能到多少个点. 算法内容 竞赛需要用到的点 1.拓扑排序仅适用于有向无环图,当然也可以判定是否图为无环图 2.能够得到从一个点能到多少个其他的点,如果n在万以上,处理得当甚至能够过千万 拓扑排序略讲 拓扑排序需要满足一个很重要的条件就是,每次进入答案的点的入度一定为0,那么根据这个条件,我们就能得到

hdu 1285 确定比赛名次 简单的拓扑排序模板题~~需要注意重边

确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 13819    Accepted Submission(s): 5547 Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直

图的遍历:拓扑排序

[需要解决的问题] 对一个有向无环图(DAG)拓扑排序. 拓扑排序就是,对图上的点进行排序,使得排在后面的点不能通过一条路径到前面的点. 比如下面这个图: 其中一个拓扑排序是1,2,3,4,5:而1,2,5,3,4就不行,因为3能到达5. 因此可以得出: 用一个队列实现,先把入度为0的点放入队列,每次将队首元素加入ans[i-j]中,删除队首元素,并删除该点连接的所有边,于是每次删除一个点都会产生一个新的入度为0的点,再把这个点插入队列,递归即可. 拓扑排序 模板如下: //复杂度:O(N+M)

HDU 1285 确定比赛名次 (拓扑排序)

链接 :  http://acm.hdu.edu.cn/showproblem.php?pid=1285 拓扑排序模板 . #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <sstream> #include <cstdio> #include <vector> #include <cm

hdu 1285 确定比赛排名(拓扑排序)

确定比赛名次                                                                         Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)                                                                                        

【拓扑排序】CODEVS 2833 奇怪的梦境

拓扑排序模板. 1 #include<cstdio> 2 #include<vector> 3 #include<stack> 4 using namespace std; 5 #define N 10001 6 vector<int>G[N]; 7 stack<int>S; 8 int n,m,x,y,ru[N],tot; 9 int main() 10 { 11 scanf("%d%d",&n,&m); 1