hdu1285
http://acm.hdu.edu.cn/showproblem.php?pid=1285

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<queue> using namespace std; const int M=502; int n,in[M]; vector<int>g[M]; void tuopo(){ priority_queue<int>que; for(int i=1;i<=n;i++) if(in[i]==0) que.push(-i); vector<int>ans; while(!que.empty()){ int u=-que.top(); que.pop(); ans.push_back(u); for(int i=0;i<g[u].size();i++){ int v=g[u][i]; in[v]--; if(in[v]==0) que.push(-v); } } int flag=1; for(int i=0;i<ans.size();i++) if(flag==1) flag=0,printf("%d",ans[i]); else printf(" %d",ans[i]); } int main(){ int m; while(~scanf("%d%d",&n,&m)){ for(int i=1;i<=n;i++) g[i].clear(),in[i]=0; while(m--){ int x,y; scanf("%d%d",&x,&y); g[x].push_back(y); in[y]++; } /*for(int i=1;i<=n;i++) cout<<in[i]<<" "; cout<<endl;*/ tuopo(); putchar(' '); } return 0; }
poj 3687
http://poj.org/problem?id=3687
分析:题目要输出的答案是1号越小越号,2号越小越好这样的优先级选择的。
而用优先队列写的要注意一下,因为先要保证1号最小,而保证1号最小的前提可能是其他小号不能取最小值。所以从小到大优先保证了那些小号的最优,而不是1号的最优。
所以再bfs中要从n开始搜,然后赋值给出来位置当前最大

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<queue> #include<vector> using namespace std; const int M=550; int in[M]; int ans[M],e[M][M]; int n,m; void tuopu(){ int tot=n; priority_queue<int>que; for(int i=n;i>=1;i--) if(in[i]==0) que.push(i); while(!que.empty()){ int u=que.top(); que.pop(); ans[u]=tot--; for(int i=n;i>=1;i--){ if(e[u][i]==1){ in[i]--; if(in[i]==0) que.push(i); } } } if(tot!=0){ printf("-1"); return ; } for(int i=1;i<=n;i++){ printf("%d",ans[i]); if(i!=n) printf(" "); } } int main(){ int t; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++) e[i][j]=0; ans[i]=0,in[i]=0; } int flag=0; while(m--){ int u,v; scanf("%d%d",&u,&v); if(v!=u){ if(e[v][u]==0) e[v][u]=1,in[u]++; } else flag=1; } if(flag) printf("-1"); else tuopu(); puts(""); } return 0; }