• bzoj4010:[HNOI2015]菜肴制作


    传送门

    感觉智商越来越不在线了,这么水的题没秒掉
    一开始想的直接拿堆维护跑拓扑排序,后来发现看错题意了
    然后就一直想怎么拿并查集去维护树的最小值,后来发现维护不了,又GG了
    无奈之下看题解,这不就建个反图就没了吗,智商真的不在线

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    #include<queue>
    #include<cstring>
    using namespace std;
    void read(int &x) {
    	char ch; bool ok;
    	for(ok=0,ch=getchar(); !isdigit(ch); ch=getchar()) if(ch=='-') ok=1;
    	for(x=0; isdigit(ch); x=x*10+ch-'0',ch=getchar()); if(ok) x=-x;
    }
    #define rg register
    const int maxn=1e5+10;priority_queue<int>q;
    int D,n,m,pre[maxn*2],cnt,in[maxn],nxt[maxn*2],h[maxn],ans[maxn],tot;
    void add(int x,int y){pre[++cnt]=y,nxt[cnt]=h[x],h[x]=cnt;}
    void topsort()
    {
    	tot=0;
    	for(rg int i=1;i<=n;i++)if(!in[i])q.push(i);
    	while(!q.empty())
    	{
    		int x=q.top();q.pop();ans[++tot]=x;
    		for(rg int i=h[x];i;i=nxt[i])
    			if(!(--in[pre[i]]))q.push(pre[i]);
    	}
    	if(tot<n){printf("Impossible!
    ");return ;}
    	for(rg int i=tot;i;i--)printf("%d ",ans[i]);
    	printf("
    ");
    }
    int main()
    {
    	read(D);
    	while(D--)
    	{
    		read(n),read(m),cnt=0,memset(h,0,sizeof h),memset(in,0,sizeof in);
    		for(rg int i=1,x,y;i<=m;i++)read(x),read(y),in[x]++,add(y,x);
    		topsort();
    	}
    }
    
  • 相关阅读:
    .net 平台 统计图表展示控件fusioncharts
    sql 查分数段人数
    小程序开发之填坑之路
    提高网站性能
    javascript History对象详解
    vue的双向数据绑定
    静态文件对加快文件加载速度的影响
    JavaScript代码异常监控
    BEM命名规则
    浏览器缓存
  • 原文地址:https://www.cnblogs.com/lcxer/p/10567936.html
Copyright © 2020-2023  润新知