[POJ 3687] Labeling Balls [拓扑排序]
2014-05-01 20:01
295 查看
给定若干大小关系,求一组可行解
要求第一个尽量小,然后第二个尽量小..等等
直接拓扑排序会出现问题,比如已知第三个比第一个小,直接拓扑排序的话会把第二个弄成最小的,第三个次小,第一个最大,而正确答案为第三个最小,第一个次小,第二个最大
所以应该倒过来,把所有的边都反向加,然后尽量让后边的大即可
要求第一个尽量小,然后第二个尽量小..等等
直接拓扑排序会出现问题,比如已知第三个比第一个小,直接拓扑排序的话会把第二个弄成最小的,第三个次小,第一个最大,而正确答案为第三个最小,第一个次小,第二个最大
所以应该倒过来,把所有的边都反向加,然后尽量让后边的大即可
#include <cstdio> #include <cstring> #include <vector> #include <queue> #include <functional> using namespace std; priority_queue <int> c; vector<int> a[210]; int ans[210],ans2; int in[210]; int n,m; int main() { int tt,i,j,x,y; scanf("%d",&tt); while (tt--) { scanf("%d%d",&n,&m); ans2=n; for (i=1;i<=n;i++) { a[i].clear(); ans[i]=0; in[i]=0; } for (i=0;i<m;i++) { scanf("%d%d",&y,&x); in[y]++; a[x].push_back(y); } for (i=1;i<=n;i++) { if (in[i]==0) c.push(i); } while (!c.empty()) { i=c.top(); c.pop(); ans[i]=ans2--; for (j=0;j<a[i].size();j++) { in[a[i][j]]--; if (in[a[i][j]]==0) c.push(a[i][j]); } } if (ans2) printf("-1\n"); else { for (i=1;i<=n;i++) printf("%d ",ans[i]); printf("\n"); } } return 0; }
相关文章推荐
- POJ 3687 Labeling Balls-拓扑排序
- 【poj】3687 Labeling Balls【拓扑排序】
- poj 3687 【拓扑排序】【Labeling Balls】
- POJ 3687-Labeling Balls(逆序拓扑排序)
- poj 3687 Labeling Balls(拓扑排序)
- POJ-3687-Labeling Balls-(求最小字典序拓扑序列)逆向建图-拓扑排序
- poj 3687 Labeling Balls(拓扑排序)
- POJ 3687 Labeling Balls (拓扑排序)
- POJ 3687 Labeling Balls【拓扑排序 优先队列】
- POJ 3687 Labeling Balls -----变种拓扑排序
- [ACM] POJ 3687 Labeling Balls (拓扑排序,反向生成端)
- POJ 3687 Labeling Balls (拓扑排序)
- POJ 3687--Labeling Balls【拓扑排序 && 逆序拓扑 && 输出在拓扑排序中的位置】
- POJ 3687 Labeling Balls(拓扑排序,逆序)
- [POJ] 3687 Labeling Balls(拓扑排序)
- 【POJ 3687】Labeling Balls (拓扑排序)
- POJ 3687 Labeling Balls 逆向建图,拓扑排序
- poj 3687 Labeling Balls 【拓扑排序 输出元素在拓扑序列中的位置】
- POJ 3687 Labeling Balls (逆向拓扑排序)
- poj 3687 Labeling Balls 初级 图 拓扑排序