题目描述
代码实现
//拓扑排序模板题,注意使用优先队列
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
const int maxn = 510;
vector<int> output;
vector<int> adj[maxn];
int n;
int m;
int inDegree[maxn];
void topoSort(){
priority_queue<int,vector<int>,greater<int>> q;
for(int i=1;i<=n;i++){
if(inDegree[i]==0){
q.push(i);
}
}
while(!q.empty()){
int cur = q.top();
q.pop();
output.push_back(cur);
for(int i=0;i<adj[cur].size();i++){
int v = adj[cur][i];
inDegree[v]--;
if(inDegree[v]==0){
q.push(v);
}
}
}
for(int i=0;i<=output.size()-1;i++){
printf("%d",output[i]);
if(i!=output.size()-1){
printf(" ");
}else{
printf("\n");
}
}
return;
}
int main(){
freopen("in.txt","r",stdin);
while(scanf("%d",&n)!=EOF){
scanf("%d",&m);
fill(inDegree,inDegree+maxn,0);
output.clear();
for(int i=0;i<maxn;i++){
adj[i].clear();
}
int u,v;
for(int i=0;i<m;i++){
scanf("%d %d",&u,&v);
adj[u].push_back(v);
inDegree[v]++;
}
//开始拓扑排序
topoSort();
}
return 0;
}
码后反思
-
这道题目非常不符合人类思维,正常人的比赛不都是积分制的吗???
-
对于输入数据:
8 5 1 2 2 3 4 3 7 6 8 6
输出居然是
1 2 4 3 5 7 8 6
对不起,告辞~~
我觉得应该是我这样写的://拓扑排序模板题,注意使用优先队列 #include <cstdio> #include <vector> #include <queue> #include <algorithm> using namespace std; const int maxn = 510; struct person{ int id; int layer; friend bool operator < (person a,person b){ return a.layer!=b.layer ? a.layer>b.layer : a.id < b.id; } }; vector<int> output; vector<int> adj[maxn]; int n; int m; int inDegree[maxn]; void topoSort(){ priority_queue<person> q; for(int i=1;i<=n;i++){ if(inDegree[i]==0){ person tmp; tmp.id = i; tmp.layer = 1; q.push(tmp); } } while(!q.empty()){ person cur = q.top(); int id = cur.id; int layer = cur.layer; q.pop(); output.push_back(id); for(int i=0;i<adj[id].size();i++){ int v = adj[id][i]; inDegree[v]--; if(inDegree[v]==0){ person tmp; tmp.id = v; tmp.layer = layer+1; q.push(tmp); } } } for(int i=output.size()-1;i>=0;i--){ printf("%d",output[i]); if(i!=0){ printf(" "); }else{ printf("\n"); } } return; } int main(){ //freopen("in.txt","r",stdin); while(scanf("%d",&n)!=EOF){ scanf("%d",&m); fill(inDegree,inDegree+maxn,0); output.clear(); for(int i=0;i<maxn;i++){ adj[i].clear(); } int u,v; for(int i=0;i<m;i++){ scanf("%d %d",&u,&v); adj[v].push_back(u); inDegree[u]++; } //开始拓扑排序 topoSort(); } return 0; }
-
这道题让我回顾了
priority_queue
里面的priority_queue<int,vector<int>,greater<int>>
这种写法,注这里面的写法,我总是忘记。。。一个vector
,一个greater
,都是<int>
…