BZOJ 4010: [HNOI2015]菜肴制作
2016-04-12 19:44
246 查看
枚举做法,然后发现这个就是倒序输出反图的字典序最大拓扑排序
证明的话大概就是对于一个标号小的点,我们肯定需要大于它的标号尽可能都在他前面,它前面的越多,逆序之后它就越靠前
证明的话大概就是对于一个标号小的点,我们肯定需要大于它的标号尽可能都在他前面,它前面的越多,逆序之后它就越靠前
<span style="font-size:18px;">#include<iostream> #include<cstdio> #include<cstring> #include<queue> using namespace std; const int N=100000+5; struct Edge{int to,next;}e ; int head ,cnt; void ins(int u,int v){ e[++cnt]=(Edge){v,head[u]};head[u]=cnt; } int deg ; priority_queue<int>q; int a ,tot; void solve(int u){ q.pop();a[++tot]=u; for(int i=head[u];i;i=e[i].next){ int v=e[i].to; deg[v]--; if(!deg[v])q.push(v); } } int main(){ //freopen("a.in","r",stdin); int T;scanf("%d",&T); while(T--){ int n,m;scanf("%d%d",&n,&m); memset(deg,0,sizeof(deg)); memset(head,0,sizeof(head));cnt=0; while(m--){ int u,v;scanf("%d%d",&u,&v);ins(v,u); deg[u]++; } while(!q.empty())q.pop(); for(int i=1;i<=n;i++)if(!deg[i])q.push(i); tot=0; while(!q.empty())solve(q.top()); if(tot!=n)puts("Impossible!"); else{ for(int i=n;i;i--) printf("%d ",a[i]); putchar('\n'); } } return 0; }</span>
相关文章推荐
- Error C2893
- 第七周上机实践项目3:文件组织多个程序类
- 嵌入式 Linux下修改MAC地址
- 嵌入式 VFS: Cannot open root device "mtdblock2" or unknown-block(2,0)
- JS实时定位
- Nginx禁止域名恶意解析
- Java NIO - CountDownLatch
- 用ServletContextListener监听器注册类型转换器
- [置顶] JavaSE学习笔记_19:Java-GUI
- Codeforces Round #303 (Div.2)-A. Toy Cars(模拟)
- C++第3次作业
- 2016去哪儿编程题:字符替换
- 润乾集算报表实现T+0报表
- XML解析小记之防止数据过长被截断
- Window系统下CMD命令大全(二)
- bzoj 4520 [Cqoi2016]K远点对
- 【leetcode】2. Add Two Numbers
- redis中数据持久化(四)
- Effective C++ 笔记1
- 2013337朱荟潼 Linux第四章读书笔记——进程调度