• 洛谷3243 [HNOI2015]菜肴制作


    题目戳这里
    Solution


    错误的想法:正向建图,然后从入度为0的点选出最小u的开始输出,然后找出u连接的点v,并把v的度数减一,再次把入度为0的点加入小根堆,这样显然有错,因为只能局部保证最小,后面的情况便无法确定。
    Hack数据: n=3,m=1 限制:❤️,1>
    按照之前的思路,3和2的入度为0,那么取出更小的2,所以答案为2,3,1,但是答案显然为3,2,1。
    那么怎么办? 正向建图不行,那么我们就反向建图,再倒序输出,这样保证越大的越晚输出,就OK了!
    具体做法:本蒟蒻因为topsort用得不熟,所以只好用大根堆模拟 ,首先把入读为0的点加入大根堆,每次取出u(因为是大根堆,所以保证u是堆中最大的),再找出u连接的点v,并把v的度数减一,再次把入度为0的点加入大根堆,最后反向输出。
    PS:虽然思路比较难想,但代码实现还是很容易的!


    Coding

    #include<bits/stdc++.h>
    using namespace std;
    const int N = 5e5;
    struct road
    {
        int to,next;
    }e[N*5];
    priority_queue <int> q;
    int cntt,ans[N],head[N],n,m,in[N],out[N];
    void add(int x,int y)
    {
        cntt++;
        e[cntt].to=y;
        e[cntt].next=head[x];
        head[x]=cntt;
    }
    int main()
    {
        int T;
        cin>>T;
        while(T--)
        {
            cntt=0;
            memset(head,0,sizeof(head));
            memset(in,0,sizeof(in));
            int cnt=0;
            cin>>n>>m;
            for(int i=1;i<=m;i++)
            {
                int x,y;
                scanf("%d%d",&x,&y);
                add(y,x);
                in[x]++;
            }
            for(int i=1;i<=n;i++)
                if(in[i]==0) q.push(i);
            int flag=0;
            while(1)
            {
                cnt++;		
                int x=q.top();
                ans[cnt]=x;
                q.pop();
                for(int i=head[x];i;i=e[i].next)
                {
                    int v=e[i].to;
                    in[v]--;
                    if(in[v]==0) q.push(v);
                }
                if(cnt==n) break ;
                if(q.empty()) {cout<<"Impossible!"<<endl; flag=1;break;}
            }
            if(!flag)
            {
                for(int i=n;i>=1;i--) 
                    printf("%d ",ans[i]);
                cout<<endl;
            }
        }
        return 0;
    }
    
    
  • 相关阅读:
    iOS--异步下载
    linux搭建ftp服务器
    hexo常用命令
    Markdown入门
    Markdown 语法和 MWeb 写作使用说明
    vi/vim
    微信聊天机器人
    .vimrc
    配置双机
    python学习笔记(一)
  • 原文地址:https://www.cnblogs.com/Le-mon/p/9527749.html
Copyright © 2020-2023  润新知