zoukankan      html  css  js  c++  java
  • BZOJ-4010 菜肴制作 贪心+堆+(拓扑图拓扑序)

    无意做到...char哥还中途强势插入干我...然后据他所言,看了一会题,一转头,我爆了正解....可怕
    

    4010: [HNOI2015]菜肴制作
    Time Limit: 5 Sec Memory Limit: 512 MB
    Submit: 1001 Solved: 490
    [Submit][Status][Discuss]

    Description
    知名美食家小 A被邀请至ATM 大酒店,为其品评菜肴。
    ATM 酒店为小 A 准备了 N 道菜肴,酒店按照为菜肴预估的质量从高到低给予1
    到N的顺序编号,预估质量最高的菜肴编号为1。由于菜肴之间口味搭配的问题,
    某些菜肴必须在另一些菜肴之前制作,具体的,一共有 M 条形如“i 号菜肴‘必须’
    先于 j 号菜肴制作”的限制,我们将这样的限制简写为< i ,j >。现在,酒店希望能求
    出一个最优的菜肴的制作顺序,使得小 A能尽量先吃到质量高的菜肴:也就是说,
    (1)在满足所有限制的前提下,1 号菜肴“尽量”优先制作;(2)在满足所有限制,1
    号菜肴“尽量”优先制作的前提下,2号菜肴“尽量”优先制作;(3)在满足所有限
    制,1号和2号菜肴“尽量”优先的前提下,3号菜肴“尽量”优先制作;(4)在满
    足所有限制,1 号和 2 号和 3 号菜肴“尽量”优先的前提下,4 号菜肴“尽量”优
    先制作;(5)以此类推。
    例1:共4 道菜肴,两条限制<3,1>、<4,1>,那么制作顺序是 3,4,1,2。例2:共
    5道菜肴,两条限制<5,2>、 <4,3>,那么制作顺序是 1,5,2,4,3。例1里,首先考虑 1,
    因为有限制<3,1>和<4,1>,所以只有制作完 3 和 4 后才能制作 1,而根据(3),3 号
    又应“尽量”比 4 号优先,所以当前可确定前三道菜的制作顺序是 3,4,1;接下来
    考虑2,确定最终的制作顺序是 3,4,1,2。例 2里,首先制作 1是不违背限制的;接
    下来考虑 2 时有<5,2>的限制,所以接下来先制作 5 再制作 2;接下来考虑 3 时有
    <4,3>的限制,所以接下来先制作 4再制作 3,从而最终的顺序是 1,5,2,4,3。
    现在你需要求出这个最优的菜肴制作顺序。无解输出“Impossible!” (不含引号,
    首字母大写,其余字母小写)

    Input
    第一行是一个正整数D,表示数据组数。
    接下来是D组数据。
    对于每组数据:
    第一行两个用空格分开的正整数N和M,分别表示菜肴数目和制作顺序限
    制的条目数。
    接下来M行,每行两个正整数x,y,表示“x号菜肴必须先于y号菜肴制作”
    的限制。(注意:M条限制中可能存在完全相同的限制)

    Output
    输出文件仅包含 D 行,每行 N 个整数,表示最优的菜肴制作顺序,或
    者”Impossible!”表示无解(不含引号)。

    Sample Input
    3
    5 4
    5 4
    5 3
    4 2
    3 2
    3 3
    1 2
    2 3
    3 1
    5 2
    5 2
    4 3

    Sample Output
    1 5 3 4 2
    Impossible!
    1 5 2 4 3

    HINT
    【样例解释】
    第二组数据同时要求菜肴1先于菜肴2制作,菜肴2先于菜肴3制作,菜肴3先于
    菜肴1制作,而这是无论如何也不可能满足的,从而导致无解。
    100%的数据满足N,M<=100000,D<=3。

    Source

    一眼感觉是模拟,就是按照要求,做菜呗,真傻...没多想,直接开搞,码完...一看  唉?!似乎我被自己绕进去了.真可怕....
    

    ShallWe大爷说了句…拓扑排序啊….顺其一看….傻逼题!,反向输出字典序最大的拓扑序…证明什么的我也不知道

    于是走起...PE?!什么鬼?稍微改了下,PE?...PE了大概7次...点开discuss......好吧.....终于愉快的A了....
    

    代码:

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    #include<queue>
    #include<vector>
    
    using namespace std;
    int read()
    {
        int x=0,f=1; char ch=getchar();
        while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
        while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
        return x*f;
    }
    
    int n,m,t;
    int head[100010],prin[100010],xz[100010];
    int cnt=0,num=0;
    struct data{int to,next;}edge[100010];
    priority_queue <int,vector<int> >q;
    
    void add(int u,int v)
    {
        cnt++;
        edge[cnt].to=v;edge[cnt].next=head[u];
        head[u]=cnt;
    }
    
    void solve(int now)
    {
        q.pop();prin[++num]=now;
        for (int i=head[now]; i; i=edge[i].next)
            {
                xz[edge[i].to]--;
                if (xz[edge[i].to]==0) q.push(edge[i].to);
            }
    }
    
    int main()
    {
        t=read();
        while (t--)
            {
                n=read(),m=read();cnt=0;num=0;
                memset(head,0,sizeof(head));
                memset(xz,0,sizeof(xz));
                for (int i=1; i<=m; i++)
                    {
                        int u=read(),v=read();
                        add(v,u);xz[u]++;
                    }
                for (int i=1; i<=n; i++)
                    if (!xz[i]) q.push(i);
                while (!q.empty()) solve(q.top());
                if (num!=n) {puts("Impossible!");continue;}
                for (int i=n; i>=1; i--)
                    printf("%d ",prin[i]);
                printf("
    ");
            }
        return 0;
    }
  • 相关阅读:
    Python动态展示遗传算法求解TSP旅行商问题
    MOEAD算法中均匀权向量的实现---Python
    HDU 5294 多校第一场1007题 最短路+最小割
    POJ 3261 Milk Patterns sa+二分
    HDU 4292 FOOD 2012 ACM/ICPC Asia Regional Chengdu Online
    CodeForces 201A Clear Symmetry
    POJ 1679 The Unique MST 确定MST是否唯一
    POJ 3268 Silver Cow Party 最短路 基础题
    POJ 2139 SIx Degrees of Cowvin Bacon 最短路 水題
    POJ2229 Sumsets 基礎DP
  • 原文地址:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5346189.html
Copyright © 2011-2022 走看看