【拓扑排序】威虎山上的分配-C++
威虎山上的分配
描述
每年过年的时候,座山雕都会给兄弟们分银子,分银子之前,座山雕允许大伙儿发表意见,因为要是没法满足所有人的意见,指不定谁要搞出什么大新闻。不过每个人在提意见的时候只能说:“我认为 A 分的银子应该比 B 多!”。座山雕决定要找出一种分配方案,满足所有人的意见,同时使得所有人分得的银子总数最少,并且每个人分得的银子最少为 100两。
输入
第一行两个整数 n,m(0<n≤10000,0<m≤20000),表示总人数和总意见数;
以下 m 行,每行两个整数 a,b,之间用一个空格隔开,表示某个意见认为第 a 号小弟所分得的银两应该比第 b 号小弟多,所有小弟的编号由 1 开始。
输出
若无法找到合法方案,则输出Unhappy!(不包含引号),否则输出一个数表示最少总银两数。
输入样例 1
3 2
1 2
2 3
输出样例 1
303
来源
计蒜客
这道题就是很典型一道拓扑排序的题目,但是有个坑点“第 a 号小弟所分得的银两应该比第 b 号小弟多”,所以在输入的时候需要把u和v反过来emm其他的话就是基本一个拓扑模板,特判一下有没有有环的情况就可以了(没有用dfs跑一遍)。
AC代码
#include<bits/stdc++.h>
using namespace std;
const int MAX_N=10000+1;
const int MAX_M=20000+1;
int cnt,money[MAX_N];
bool vis[MAX_N];
struct edge{
int v,next;
int len;
}E[MAX_M];
int p[MAX_N],eid=1;
void insert(int u,int v){
E[eid].v=v;
E[eid].next=p[u];
p[u]=eid++;
}
int n,m;
int indegree[MAX_N];
void topo(){
queue<int> q;
for(int i=1;i<=n;i++)
{
if(indegree[i]==0)
{
q.push(i);
}
}
while(!q.empty())
{
int now=q.front();
vis[now]=1;
cnt++;
q.pop();
for(int i=p[now];i!=0;i=E[i].next)
{
int v=E[i].v;
indegree[v]--;
if(indegree[v]==0)
{
q.push(v);
vis[v]=1;
//printf("money[%d]=money[%d]+1\n",v,i);
money[v]=money[now]+1;
}
}
}
}
int main()
{
memset(indegree,0,sizeof(indegree));
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
insert(v,u);
indegree[u]++;
}
topo();
int ans=0;
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
cout<<"Unhappy!"<<endl;
return 0;
}
//printf("money[%d]=%d\n",i,money[i]);
ans+=money[i];
}
cout<<ans+n*100<<endl;
return 0;
}
ov.
【拓扑排序】威虎山上的分配-C++的更多相关文章
- Codeforces 919D Substring ( 拓扑排序 && DAG上的DP )
题意 : 给出含有 N 个点 M 条边的图(可能不连通或者包含环),每个点都标有一个小写字母编号,然后问你有没有一条路径使得路径上重复字母个数最多的次数是多少次,例如图上有条路径的顶点标号顺序是 a ...
- 【不带权图算法之拓扑排序】-C++
拓扑排序算法主要由以下两步循环执行,直到不存在入度为 的顶点为止. 选择一个入度为 的顶点并将它输出: 删除从该顶点连出的所有边. 循环结束,若输出的顶点数小于图中的顶点数,则表示该图中存在回路,也就 ...
- hihocoder 1343 : Stable Members【拓扑排序】
hihocoder #1343:题目 解释:一个学习小组,一共有N个学员,一个主管.每个学员都有自己的导师(一个或者多个),导师可以是其他学员也可以是主管.每周学员都要把自己的学习报告和收到的报告提交 ...
- HDU1285-确定比赛名次-拓扑排序板子题
有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道 ...
- 动态规划 洛谷P4017 最大食物链计数——图上动态规划 拓扑排序
洛谷P4017 最大食物链计数 这是洛谷一题普及/提高-的题目,也是我第一次做的一题 图上动态规划/拓扑排序 ,我认为这题是很好的学习拓扑排序的题目. 在这题中,我学到了几个名词,入度,出度,及没有环 ...
- [ACM] POJ 3687 Labeling Balls (拓扑排序,反向生成端)
Labeling Balls Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10161 Accepted: 2810 D ...
- 【BZOJ2330】糖果(差分约束系统,强连通分量,拓扑排序)
题意: 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的多,于是在分配糖 ...
- POJ3687拓扑排序+贪心
题意: 给你n个求,他们的重量是1-n(并不是说1号求的重量是1...),然后给你m组关系a,b,表示a的重量小于b的重量,然后让你输出满足要求的前提下每个球的重量,要求字典序最小. 思路 ...
- 算法与数据结构(七) AOV网的拓扑排序
今天博客的内容依然与图有关,今天博客的主题是关于拓扑排序的.拓扑排序是基于AOV网的,关于AOV网的概念,我想引用下方这句话来介绍: AOV网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...
随机推荐
- ARTS 12.24 - 12.28
从陈皓博主的专栏里学到一个概念,争取可以坚持下去: 每周一个 Algorithm,Review 一篇英文文章,总结一个工作中的技术 Tip,以及 Share 一个传递价值观的东西! 一个 Algori ...
- CPU的最小执行单位是线程,协程不需要qt支持...直接用现成的协程库就行了
协程也就在I/O操作上才有优势,Qt事件循环,本事很多I/O已经是异步了,利用好异步(虽然都说异步有点反人类思维).因为CPU的执行最小单位是线程,协程也只是在其之上又调度而已. 我的意思是利用好异步 ...
- Qt移动开发大部分的场景基本上实现没问题,listview支持刷新3000~5000的实时数据没有任何压力(QML的几个大型应用)
作者:xq zh链接:https://www.zhihu.com/question/29636221/answer/47265577来源:知乎著作权归作者所有,转载请联系作者获得授权. 不知道vs移动 ...
- 为什么说 2017 年你必须要学习 Go 了(多核,网络,多人协作,简单非OO,没有注解,Native,垃圾收集,代码优雅),附两个评论
为什么要学习Go Go是未来的服务端语言— Tobias Lütke, Shopify.在过去的几年中,Golang逐步流行起来. 还有什么能比一门新语言让码农们疯狂呢? 因此,我开始学习了一段时间G ...
- Qt for Android之Hello World
Qt for Android (Hello World APK 创建)Qt是跨平台的,如桌面.移动.嵌入式平台.Qt for Android可以在Android v2.3.3 (API level 1 ...
- Gps坐标有效性判定
百科:纬度 是指某点与地球球心的连线和地球赤道面所成的线面角,其数值在0至90度之间.位于赤道以北的点的纬度叫北纬,记为N:位于赤道以南的点的纬度称南纬,记为S. var regex = new Re ...
- 使用 docker 搭建 nginx+php-fpm 环境 (两个独立镜像)
:first-child{margin-top:0!important}.markdown-body>:last-child{margin-bottom:0!important}.markdow ...
- 【原创】ABAP根据文件路径获取文件所在目录
*&---------------------------------------------------------------------* *& Form frm_get_pat ...
- gitlab安装笔记二_Centos7配置163yum源
进入配置目录 cd /etc/yum.repos.d 压缩备份原有的配置 sudo tar cvf base.tar.gz *.repo 可以解压查看备份 sudo tar xvf base. ...
- 09 audio和vedio标签
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...