您的位置:首页 > 其它

[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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: