2016"百度之星" - 初赛(Astar Round2A)1006 Gym Class(HDU5695)——贪心+拓扑排序
2024-09-01 15:23:46
分析:首先,利用贪心可知,如果要所有人的分数和最高,需要把序号大的优先放在前面。其次,对于a的前面不能为b,那么只能a在b前面了,那么就建立一条从a到b的边,并且b的入度加1。然后就是拓扑排序了。要分数最高,则把哪些入度为0的点(他们不需要有哪些人一定要在他们前面,最自由)丢进优先队列,然后就可以实现把序号大的尽量放在前面而且满足题意了。
具体见代码:
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
#include <queue>
using namespace std;
typedef long long ll; vector<int> G[+];
int in[+],val[+];
int n,m;
void solve()
{
int sit=;
priority_queue<int> Q;
for(int i=;i<=n;i++) if(!in[i]) Q.push(i);
while(!Q.empty())
{
int x=Q.top();Q.pop();
val[sit++]=x;
for(int i=;i<G[x].size();i++)
{
int v = G[x][i];
in[v]--;
if(!in[v]) Q.push(v);
}
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) G[i] .clear();
memset(in,,sizeof(in));
memset(val,,sizeof(val));
while(m--)
{
int u,v;
scanf("%d%d",&u,&v);
G[u].push_back(v);
in[v]++;
}
solve();
int minn=+;
ll ans=;
for(int i=;i<=n;i++)
{
minn=min(minn,val[i]);
ans+=(ll)minn;
}
printf("%I64d\n",ans);
}
return ;
}
最新文章
- mock测试框架Mockito
- IIS6 + PHP 访问页面出现:需要进行身份验证的问题
- CS小分队第一阶段冲刺站立会议(5月6日)
- POJ 2114 - Boatherds
- Design Mode 之 结构模式
- topcoder srm 610 div2 250
- 怎样配置Tomcat环境变量
- Source Insight 安装使用
- Struts中文件的上传与下载
- BZOJ 2878 迷失游乐园
- SQL 两表关联查询 where 条件中等号两端字段顺序对效率的影响
- 使用composer安装laravel
- Nginx反向代理以及负载均衡配置
- echarts图表里label文字过长换行的方法
- android 摇一摇+震动+声音效果
- [Android] Android 异步定时任务实现的三种方法(以SeekBar的进度自动实现为例)
- 【题解】 bzoj1076: [SCOI2008]奖励关 (装压+期望dp)
- Roller5.0.3安装配置部署 step by step
- python在使用redis时zadd错误
- mongodb 两小时入门
热门文章
- POJ 2485 Prim 找最长的边
- SimpleDateFormat线程安全问题
- Python实现英文文章加密传送,收到后进行解密
- 复杂度n求数组的第K大值
- 【转】CSS之Background-Position left right center top bottom属性
- 14.SpringMVC核心技术-类型转换器
- 3.MySQL的架构介绍
- Java检查异常和非检查异常,运行时异常和非运行时异常的区别
- redis——搭建
- Image Processing and Computer Vision_Review:A survey of recent advances in visual feature detection(Author&#39;s Accepted Manuscript)——2014.08