拓扑排序模板

牛客测试链接https://www.nowcoder.com/practice/88f7e156ca7d43a1a535f619cd3f495c
拓扑排序+邻接表

#include <bits/stdc++.h>
using namespace std;
const int N=3e5+10;
typedef long long ll;
int n,m;
int indg[N];
int que[N];
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m;
    vector<vector<int>>edges(m+5);
    for(int i=0;i<m;i++)
    {
        int f,t;
        cin>>f>>t;
        edges[f].push_back(t);
        indg[t]++;
    }
    int cnt=0;
    int l=0;
    int r=0;
    for(int i=1;i<=n;i++)
    {
        if(indg[i]==0)
        {
            que[r++]=i;
        }
    }

    while(l<r)
    {
        int cur = que[l++];
        cnt++;
        for(auto indx:edges[cur])
        {
            if(--indg[indx]==0)
            {
                que[r++]=indx;
            }
        }
    }

    if(cnt<n)cout<<-1<<endl;
    else
    {
        for(int i=0;i<n-1;i++)cout<<que[i]<<' ';
        cout<<que[n-1]<<endl;
    }



    return 0;
}

拓扑排序+链式前向星

#include <bits/stdc++.h>
using namespace std;
const int N=3e5+10;
typedef long long ll;
int n,m;
int head[N],nt[N],to[N];
int indg[N];
int que[N];
int l=0,r=0;
int cnt=1;
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m;
    for(int i=0;i<m;i++)
    {
        int f,t;
        cin>>f>>t;
        nt[cnt]=head[f];
        to[cnt]=t;
        head[f]=cnt++;
        indg[t]++;
    }
    for(int i=1;i<=n;i++)
    {
        if(indg[i]==0)que[r++]=i;
    }
    cnt=0;
    while(l<r)
    {
        int cur = que[l++];
        cnt++;
        for(int i=head[cur];i!=0;i=nt[i])
        {
            if(--indg[to[i]]==0)que[r++]=to[i];
        }
    }
    // cout<<cnt<<endl;
    if(cnt==n)
    {
        for(int i=0;i<n-1;i++)cout<<que[i]<<' ';
        cout<<que[n-1]<<endl;
    }
    else cout<<-1<<endl;

    return 0;
}

洛谷测试链接:https://www.luogu.com.cn/problem/U107394

拓扑排序+链式前向星+小根堆

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long ll;
int n,m;
int head[N],nt[N],to[N];
int cnt=1;
int heap[N];
int heapsz;
int indg[N];
int ans[N];

void ph(int x)
{
    int i = heapsz++;
    heap[i]=x;
    while(heap[i]<heap[(i-1)/2])
    {
        swap(heap[i],heap[(i-1)/2]);
        i=(i-1)/2;
    }
}

int pop()
{
    int ans = heap[0];
    heap[0]=heap[--heapsz];
    int i=0;
    int l=1;
    while(l<heapsz)
    {
        int best = l+1<heapsz&&heap[l]>heap[l+1]?l+1:l;
        best = heap[best]<heap[i] ? best : i;
        if(best == i)
        {
            break;
        }
        swap(heap[best],heap[i]);
        i = best;
        l = i*2+1;
    }
    return ans;
}


bool empty()
{
    return heapsz==0;
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m;
    for(int i=0;i<m;i++)
    {
        int f,t;
        cin>>f>>t;
        nt[cnt]=head[f];
        to[cnt]=t;
        indg[t]++;
        head[f]=cnt++;
    }

    for(int i=1;i<=n;i++)
    {
        if(indg[i]==0)
        {
            ph(i);
        }
    }

    int cnt=0;
    while(!empty())
    {
        int cur = pop();
        ans[cnt++]=cur;
        for(int i = head[cur];i!=0;i=nt[i])
        {
            if(--indg[to[i]]==0)
            {
                ph(to[i]);
            }
        }
    }

    if(cnt!=n)cout<<-1<<endl;
    else 
    {
        for(int i=0;i<n;i++)cout<<ans[i]<<' ';
        cout<<endl;
    }

    return 0;
}

用stl的做法

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long ll;
int n,m;
int head[N],nt[N],to[N];
int cnt=1;
int heap[N];
int heapsz;
int indg[N];
int ans[N];
priority_queue<int,vector<int>,greater<int>>hp;
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m;
    for(int i=0;i<m;i++)
    {
        int f,t;
        cin>>f>>t;
        nt[cnt]=head[f];
        to[cnt]=t;
        indg[t]++;
        head[f]=cnt++;
    }

    for(int i=1;i<=n;i++)
    {
        if(indg[i]==0)
        {
            hp.push(i);
        }
    }

    int cnt=0;
    while(!hp.empty())
    {
        int cur = hp.top();
        hp.pop();
        ans[cnt++]=cur;
        for(int i = head[cur];i!=0;i=nt[i])
        {
            if(--indg[to[i]]==0)
            {
                hp.push(to[i]);
            }
        }
    }

    if(cnt!=n)cout<<-1<<endl;
    else 
    {
        for(int i=0;i<n;i++)cout<<ans[i]<<' ';
        cout<<endl;
    }

    return 0;
}

leedcode测试链接https://leetcode.cn/problems/course-schedule-ii/description/

class Solution {
public:
    vector<int> findOrder(int numCourses, vector<vector<int>>& prerequisites) {
        vector<int>que(numCourses);
        vector<vector<int>>graph(numCourses);
        int cnt=0;
        vector<int>indegree(numCourses);
        for(auto edge:prerequisites)
        {
            int f = edge[1];
            int to = edge[0];
            graph[f].push_back(to);
            indegree[to]++;
        }
        int l=0;
        int r=0;
        for(int i=0;i<numCourses;i++)
        {
            if(indegree[i]==0)
            {
                que[r++]=i;
            }
        }
        while(l<r)
        {
            int cur = que[l++];
            cnt++;
            for(auto i:graph[cur])
            {
                indegree[i]--;
                if(indegree[i]==0)que[r++]=i;
            }
        }
        vector<int>arr;
        return cnt==numCourses?que:arr;
    }
};
posted @ 2025-07-14 17:09  屈臣  阅读(5)  评论(0)    收藏  举报