/* 優先隊列 */ const int maxn=505; int a[maxn][maxn],n,in[maxn]; void topsort() { priority_queue<int,vector<int>,greater<int> > q; while(!q.empty())q.pop(); for(int i=1;i<=n;++i) if(in[i]==0)q.push(i); while(!q.empty()) { int tp=q.top(); printf("%d\n",tp); q.pop(); for(int i=1;i<=n;++i) if(a[tp][i]) { in[i]--; if(in[i]==0)q.push(i); } } }
例題 - HDU 1285c++
#include<bits/stdc++.h> using namespace std; #define ms(a,x) memset(a,x,sizeof a) const int maxn=505; int a[maxn][maxn],n,m,in[maxn],ans[maxn]; int main() { while(~scanf("%d%d",&n,&m)) { ms(a,0); ms(in,0); for(int i=1;i<=m;++i) { int x,y; scanf("%d%d",&x,&y); if(a[x][y])continue;//數據有重複 a[x][y]=1; in[y]++; } priority_queue<int,vector<int>,greater<int> > q; while(!q.empty())q.pop(); for(int i=1;i<=n;++i) if(in[i]==0)q.push(i); int cnt=0; while(!q.empty()) { int tp=q.top(); ans[++cnt]=tp; q.pop(); for(int i=1;i<=n;++i) if(a[tp][i]) { in[i]--; if(in[i]==0)q.push(i); } } for(int i=1;i<n;++i)printf("%d ",ans[i]); printf("%d\n",ans[n]);//末尾無空格 } }