HDU5638 bestcoder#74 Toposort 题解&代码
2016-03-07 21:16
316 查看
来自玄学的乱搞,做题的时候一脸蒙逼…没看懂题orz
我这智商感觉手表是用不了了
标解是线段树,但是这种乱搞能过…大概是因为这个DAG是稀疏图的缘故【妈的怎么稠密
乱搞非常暴力…
优先队列把所有可以使用的点(入度不大于k,即可以有效删去使它成为入度为0的点)全部丢进去,从满足要求的字典序第一位开始查找,贪心地将点丢进答案…顺便更新k就行辣
我这智商感觉手表是用不了了
标解是线段树,但是这种乱搞能过…大概是因为这个DAG是稀疏图的缘故【妈的怎么稠密
乱搞非常暴力…
优先队列把所有可以使用的点(入度不大于k,即可以有效删去使它成为入度为0的点)全部丢进去,从满足要求的字典序第一位开始查找,贪心地将点丢进答案…顺便更新k就行辣
#include <iostream> #include <vector> #include <queue> #include <cstdio> #include <cstring> #define MOD 1000000007 using namespace std; const int maxn = 100005; int T,n,m,k,u,v,tot,temp; int ans[maxn], vis[maxn], in[maxn]; long long sum; vector <int> edge[maxn]; priority_queue <int> q; int main(void) { scanf("%d", &T); while(T--) { tot = 0; scanf("%d%d%d", &n, &m, &k); memset(vis, 0, sizeof(vis)); memset(in, 0, sizeof(in)); for(int i = 1; i <= n; i++) edge[i].clear(); for(int i = 0; i < m; i++) { scanf("%d%d", &u, &v); in[v]++; edge[u].push_back(v); } for(int i = 1; i <= n; i++) if(in[i] <= k) q.push(-i), vis[i] = 1; while( !q.empty() ) { temp = -(q.top()); q.pop(); if(k >= in[temp]) ans[tot++] = temp, k -= in[temp]; else { vis[temp] = 0; continue; } for(int i = 0; i < edge[temp].size(); i++) { in[edge[temp][i]]--; if(in[edge[temp][i]] <= k && !vis[edge[temp][i]]) q.push(-edge[temp][i]), vis[edge[temp][i]] = 1; } } sum = 0; for(int i = 0; i < tot; i++) { sum += (long long)ans[i]*(long long)(i+1); sum %= MOD; } cout<<sum<<endl; } return 0; }
相关文章推荐
- Java日期
- 四.Django的template
- 解决java.lang.NoClassDefFoundError: ch/qos/logback/core/joran/spi/Pattern
- 【hdu 5638】Toposort 中文题意&题解&代码(C++)
- spring使用DataSoure注入参数时报No supported DataSource type found
- java 正则表达式
- 排序算法之希尔排序(java实现)
- 二叉树的C++指针实现
- 使用 Java API 操作 HBase
- C++标准库简介、与STL的关系。
- G代码 机器人的CNC实现
- 从爬取湖北某高校hub教务系统课表浅谈Java信息抓取的实现 —— import java.*;
- java里的静态变量是放在了堆内存还是栈内存?
- Java设计模式之访问者模式
- php日记——配置的坑
- php MySQL使用rand函数随机取记录(转)
- 2016蓝桥杯假期任务之《回文数字》
- 验证码图像识别-python
- ASP.NET(C#)——加一列按钮
- theano测试代码