HDU 5965 Gym Class 贪心+toposort
2016-05-23 22:34
330 查看
分析:就是给一些拓补关系,然后求最大分数,所以贪心,大的越靠前越好,小的越靠后越好
剩下的就是toposort,当然由于贪心,所以使用优先队列
View Code
剩下的就是toposort,当然由于贪心,所以使用优先队列
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <string> #include <stack> #include <vector> #include <map> #include <queue> #include <algorithm> #include <utility> using namespace std; typedef long long LL; const int N=1e5+5; const int INF=0x3f3f3f3f; const LL mod=1e9+7; priority_queue<int>q; struct Edge{ int v,next; }edge ; int head ,tot; void add(int u,int v){ edge[tot].v=v; edge[tot].next=head[u]; head[u]=tot++; } int d ; int main() { int T,cas=0; scanf("%d",&T); while(T--){ // printf("Case #%d:\n",++cas); int n,m; scanf("%d%d",&n,&m); memset(head,-1,sizeof(head)),tot=0; memset(d,0,sizeof(d)); for(int i=1;i<=m;i++){ int u,v; scanf("%d%d",&u,&v); add(u,v);++d[v]; } while(!q.empty())q.pop(); for(int i=1;i<=n;++i) if(!d[i])q.push(i); LL ans=0;int cur=-1; while(!q.empty()){ int u=q.top(); q.pop(); if(cur==-1)cur=u; else cur=min(cur,u); ans+=cur; for(int i=head[u];~i;i=edge[i].next){ int v=edge[i].v; --d[v]; if(!d[v])q.push(v); } } printf("%I64d\n",ans); } return 0; }
View Code
相关文章推荐
- opencv之颜色过滤只留下图片中的红色区域
- Nginx反向代理的配置
- Learning OpenCV: read AVI video file
- linux命令之tail
- Android 基础总结:(一)Android系统架构
- RabbitMQ三种Exchange模式(fanout,direct,topic)的性能比较
- Linux 添加开机自启动
- linux命令之rpm
- bash扩展
- linux基本命令(30)——chown命令
- CentOS6.6图文详细安装教程(有些设置大部分教程没出现过,附带网络设置等)
- centos6.5 搭建hadoop 开发环境(单台服务器)
- [Linux][Install guide]Ubuntu多系统安装注意事项
- Linux I/O模型 与 Java I/O模型、驱动中的异步函数 的区别。
- linux实践——内核编程 基础模块
- kalilinux安装lantern
- 【BZOJ4199】品酒大会,后缀数组+并查集维护
- 高并发金融应用架构优化与平台创新
- shell通配符
- 阿里云服务器-百度开放云域名-WordPress网站部署踩的坑