BZOJ 4010 HNOI2015 菜肴制作 拓扑排序+堆

题目大意:给定一张无向图,求一个拓扑序,使:

1的位置最靠前

在保证上面的条件下使2的位置最靠前

在保证上面的条件下使3的位置最靠前

……

注意不是字典序最小!例如样例3

建立反图,对反图求字典序最大的拓扑序,然后反向输出即可。

我不知道为什么。真的不知道。

求个解答在线等。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 100100
using namespace std;
struct abcd{
    int to,next;
}table[M];
int head[M],tot;
int n,m;
int degree[M];
int stack[M],top;
void Add(int x,int y)
{
    table[++tot].to=y;
    table[tot].next=head[x];
    head[x]=tot;
}
void Initialize()
{
    memset(head,0,sizeof head);
    tot=1;
    memset(degree,0,sizeof degree);
}
namespace Priority_Queue{
    int heap[M],top;
    void Insert(int x)
    {
        heap[++top]=x;
        int t=top;
        while(t>1)
        {
            if(heap[t]>heap[t>>1])
                swap(heap[t],heap[t>>1]),t>>=1;
            else
                break;
        }
    }
    void Pop()
    {
        heap[1]=heap[top--];
        int t=2;
        while(t<=top)
        {
            if( t<top && heap[t+1]>heap[t] )
                ++t;
            if(heap[t]>heap[t>>1])
                swap(heap[t],heap[t>>1]),t<<=1;
            else
                break;
        }
    }
}
void Topology_Sort()
{
    using namespace Priority_Queue;
    int i;
    for(i=1;i<=n;i++)
        if(!degree[i])
            Insert(i);
    while(Priority_Queue::top)
    {
        int x=heap[1];Pop();
        stack[++::top]=x;
        for(i=head[x];i;i=table[i].next)
            if(!--degree[table[i].to])
                Insert(table[i].to);
    }
}
int main()
{
    int T,i,x,y;
    for(cin>>T;T;T--)
    {
        Initialize();
        scanf("%d%d",&n,&m);
        for(i=1;i<=m;i++)
        {
            scanf("%d%d",&x,&y);
            Add(y,x);
            degree[x]++;
        }
        top=0;
        Topology_Sort();
        if(top!=n)
            puts("Impossible!");
        else
        {
            for(i=n;i;i--)
                printf("%d ",stack[i],i==1?‘\n‘:‘ ‘);
            puts("");
        }
    }
    return 0;
}
时间: 2024-11-04 05:48:56

BZOJ 4010 HNOI2015 菜肴制作 拓扑排序+堆的相关文章

bzoj 4010: [HNOI2015]菜肴制作 拓扑排序

4010: [HNOI2015]菜肴制作 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/67 Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号为1.由于菜肴之间口味搭配的问题, 某些菜肴必须在另一些菜肴之前制作,具体的,一共有 M 条形如“i 号菜肴‘必须’

bzoj 4010: [HNOI2015]菜肴制作(优先队列+拓扑排序)

4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec  Memory Limit: 512 MB Submit: 1199  Solved: 583 [Submit][Status][Discuss] Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号为1.由于菜肴之间口味搭配的问题, 某些菜肴必须在另一些菜肴之前制作,具体

【BZOJ4010】[HNOI2015]菜肴制作 拓扑排序

[BZOJ4010][HNOI2015]菜肴制作 Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予1到N的顺序编号,预估质量最高的菜肴编号为1.由于菜肴之间口味搭配的问题,某些菜肴必须在另一些菜肴之前制作,具体的,一共有 M 条形如“i 号菜肴‘必须’先于 j 号菜肴制作”的限制,我们将这样的限制简写为<i,j>.现在,酒店希望能求出一个最优的菜肴的制作顺序,使得小 A能尽量先吃到质量

BZOJ4010 HNOI2015 菜肴制作 拓扑排序+贪心

题意:给定限制条件(a,b)表示a必须在b之前,求所有合法序列中,小的数尽量在前面的方案 题解:首先我们根据限制条件建反向图,然后在反向图上求字典序最小的拓扑序(队列改为堆),逆序输出即可. #include <queue> #include <functional> #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include

4010: [HNOI2015]菜肴制作

4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec  Memory Limit: 512 MBSubmit: 446  Solved: 251[Submit][Status][Discuss] Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号为1.由于菜肴之间口味搭配的问题, 某些菜肴必须在另一些菜肴之前制作,具体的,一

cogs1958 菜肴制作 拓扑排序

链接:http://cogs.pro/cogs/problem/problem.php?pid=1958 题意:给出一些约束条件,要求得出字典序最小的符合所有条件的方案. 这道题很显然是一个在$AOE$上的程序流程问题,显然是一个拓扑排序.但是这个拓扑排序有点意思,因为它要求字典序最小. 那么我们就要找出一种方法,使得最小的出现在最前面,那么我们就考虑用堆维护,倒序建边. 如果我们正序建边,很有可能我们选取了一个点之后再向下走发现了一个更小的点,而且这个更小的点还是可以放在前面的.而如果倒序建边

B4010 菜肴制作 拓扑排序(附随机跳题代码)

今天写了一个自己的随机跳题小程序,第一次试发现跳的全是不可做题,但是在周围我一眼看见了这个题,不能说一眼看出来,但是也是比较有思路,所以就做他了! 做得比较顺利,做完之后美滋滋,突然发现样例第三组过不了...然后发现自己算法有问题...GG,又想了一个超复杂的算法,刚开始写就放弃了,根本没法写. 于是看题解(本来以为自己能A),就看了一行就明白了,只要倒着存边再倒着输出就行了!!!QAQ!! 跳题代码: #include<iostream> #include<cstdio> #in

【BZOJ 4010】 [HNOI2015]菜肴制作

4010: [HNOI2015]菜肴制作 Time Limit: 5 Sec Memory Limit: 512 MB Submit: 426 Solved: 242 [Submit][Status][Discuss] Description 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号为1.由于菜肴之间口味搭配的问题, 某些菜肴必须在另一些菜肴之前制作,具体的,一

[HNOI2015]菜肴制作 题解(自带口胡证明)

[HNOI2015]菜肴制作 时间限制: 1 Sec  内存限制: 512 MB 题目描述 知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴. ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予 1到N的顺序编号,预估质量最高的菜肴编号为1.由于菜肴之间口味搭配的问题, 某些菜肴必须在另一些菜肴之前制作,具体的,一共有 M 条形如"i 号菜肴'必须' 先于 j 号菜肴制作"的限制,我们将这样的限制简写为<i,j>.现在,酒店希望能求 出一个最