加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

POJ PKU 3687 topsort

(2010-05-07 14:27:47)
标签:

poj

pku

3687

it

分类: 杂题

题目描述:

n个球,每个球的重量分别从1到n。

让你把这n个球排成一列,但是给你m个限制条件。

每个条件有两个数字a和b。

表示排在a位置的球重量需要小于排在b位置的球的重量。

 

满足m个条件下,让这个排列的字典序最小。

 

解题报告:

加一些判断和改进的top排序。

g[a][b] = 1;

cd[a] .

表示a到b有边,即a < b。

同时a的出度(cd)加一。

 

排序过程:

每次只确定最后一个位置n,即从出度为0的球里面选一个重量最大球c的,排在n位置。n--。

然后凡是g[i][c] == 1的球i,出度--。

循环n次即可。

 

证明:

贪心,我也不太清楚为什么,求大牛正解!

代码如下:

#include<iostream>
#include<algorithm>
using namespace std;
#define size 201
int t, n, m, a, b, x[size][size], cd[size], que[size], ans[size];;
bool vst[size];
bool judge()
{
    int head, tail, cnt = n;
    tail = head = 0;
    for(int i = n; i >= 1; i--)
        if (cd[i] == 0)
        {
            que[tail ] = i;
            cout << i << endl;
            ans[i] = cnt--;
            vst[i] = 1;
            break;
        }
    while(head < tail)
    {
        for(int i = 1; i <= n; i )
            if (i != que[head] && x[i][que[head]] == 1)
                --cd[i];
        for(int i = n; i >= 1; i--)
            if (!vst[i] && !cd[i])
            {
                que[tail ] = i;
                vst[i] = 1;
                cout << i << endl;
                ans[i] = cnt--;
                break;
            }
        head ;
    }
    return cnt == 0;
}
int main()
{
    scanf("%d", &t);
    while(t--)
    {
        scanf("%d%d", &n, &m);
        memset(x, 0, sizeof(x));
        memset(cd, 0, sizeof(cd));
        for(int i = 0; i < m; i )
        {
            scanf("%d%d", &a, &b);
            if (!x[a][b])
            {
                x[a][b] = 1;
                cd[a] ;
            }
        }
        memset(vst, 0, sizeof(vst));
        if (judge())
        {
            printf("%d", ans[1]);
            for(int i = 2; i <= n; i )
                printf(" %d", ans[i]);
            putchar('\n');
        }
        else
            printf("-1\n");
    }
    return 0;
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有