这道题就是模版题解
2026-08-04 15:30:09
发布于:浙江
9阅读
0回复
0点赞
在拓扑排序的学习中,这是最基础的。最好多多练习。
算法介绍
既然任务有优先级,当一个任务完成前需要另一个任务的完成才能通行,是不能选他的。
那就选择没有前置任务的任务先完成。
这道题的解法
我们用一个数组来记录各个节点的前置任务数量
就是从u到v时ind[v]++;
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
g[u].push_back(v);
ind[v]++;
}
在解决任务的时候,ind[v]--;
while(q.size()){
int now=q.top();
q.pop();
ans.push_back(now);
for(auto v:g[now]){
ind[v]--;
if(ind[v]==0){
q.push(v);
}
}
}
最后判断完成任务的数量是不是等于任务总量
if(ans.size()==n){
for(auto it:ans){
cout<<it<<" ";
}
}else{
cout<<"has circle.";
}
没错,ind用来记录。
完整代码
#include<bits/stdc++.h>
using namespace std;
int n,m;
vector<int>g[200005];
int ind[200005];
vector<int>ans;
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
g[u].push_back(v);
ind[v]++;
}
priority_queue<int,vector<int>,greater<int>>q;
for(int i=1;i<=n;i++){
if(ind[i]==0)q.push(i);
}
while(q.size()){
int now=q.top();
q.pop();
ans.push_back(now);
for(auto v:g[now]){
ind[v]--;//这个任务已经好了
if(ind[v]==0){
q.push(v);
}
}
}
if(ans.size()==n){
for(auto it:ans){
cout<<it<<" ";
}
}else{
cout<<"has circle.";
}
return 0;
}
这里空空如也







有帮助,赞一个