拓扑排序模板
牛客测试链接: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;
}
};

浙公网安备 33010602011771号