【拓扑排序】威虎山上的分配-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网:在现代化管理中,人们常用有向图来描述和分析一项工程的计划 ...
随机推荐
- SFC游戏列表(维基百科)
SFC游戏列表 日文名 中文译名 英文版名 发行日期 发行商 スーパーマリオワールド 超级马里奥世界 Super Mario World 1990年11月21日 任天堂 エフゼロ F-Zero F-Z ...
- mysql8解压版安装
1.下载 下载mysql8 2.安装 ① 解压到需要安装的目录,然后新建一个my.ini(位于解压目录下,与bin目录在同一个目录下) # For advice on how to change se ...
- 反汇编分析__stdcall和__cdecl的异同
C++代码如下:.h头文件 #pragma once#ifdef DLLTestAPI#else#define DLLTestAPI _declspec(dllimport)#endifint DLL ...
- Qt Resource系统概说(资源压缩不压缩都可以)
什么是Qt Resource系统?简单的说,就是在可执行程序中存储binary文件,而且还是与平台无关的. 与Qt Resource系统密切相关的有三个法宝,分别是qmake.rcc.QFile. q ...
- 剖析Qt的事件机制原理(源代码级别)
在用Qt写Gui程序的时候,在main函数里面最后依据都是app.exec();很多书上对这句的解释是,使Qt程序进入消息循环.下面我们就到exec()函数内部,来看一下他的实现原理.Let's go ...
- comboBox控件动态绑定数据
/// <summary> /// load加载数据 /// </summary> /// <param name=" ...
- Java入门网络编程-使用UDP通信
程序说明: 以下代码,利用java的网络编程,使用UDP通信作为通信协议,描述了一个简易的多人聊天程序,此程序可以使用公网或者是局域网进行聊天,要求有一台服务器.程序一共分为2个包,第一个包:udp, ...
- 【设计模式】结构型01代理模式(Proxy Pattern)
代理模式(Proxy Pattern) 定义:顾名思义,增加中间层,为其他对象提供一种代理以控制对这个对象的访问.核心在于代理二字. 1.和适配器模式的区别:适配器模式主要改变所考虑对象的接口,而代理 ...
- 【java爬虫】网络爬虫思路
主要是针对某个单独的网站进行页面的爬取,方式有好多种,记录一下大体的思路. 方法1: a.通过http请求获取返回的静态页面. b.将返回的字符串页面进行split,切割成字符串数组. c.遍历字符串 ...
- Salesforce Admin篇(一)Duplicate Management
参考资料:https://help.salesforce.com/articleView?id=managing_duplicates_overview.htm Salesforce 很重要的一个平台 ...