hdu2647 逆拓扑,链式前向星。
pid=2647">原文地址
题目分析
题意
老板发工资,可是要保证发的工资数满足每一个人的期望,比方A期望工资大于B,仅仅需比B多1元钱就可以。老板发的最低工资为888元。输出老板最少发的工资总数。若是无法满足大家的期望,则输出-1。
分析
非常明显这是一个拓扑问题。若存在环则无法满足大家的期望。若按常理,A>B,则可能会建立A指向B的有向边。此题不然,由于我们仅仅知道最少的钱数是888,所以从小到大进行拓扑排序更为恰当。所以是建立B指向A的有向边。
此之为逆拓扑排序。由于这样处理后排序的结果与原先拓扑排序的顺序相反。
以图论观点来看,若为邻接矩阵存储就视作了矩阵的逆置。
链式前向星
链式前向星是图的一种存储方式,事实上质是邻接表的静态存储。
关于链式前向星的很多其它介绍。可移步《深度理解链式前向星》。
吐槽,链式前向星并不是学术上的术语,貌似是国内网友的起名智慧。。因此国外没有这种术语。只是这个词在国内还是有认可度的。
我的代码
用了点小技巧,比方static变量。还有重载构造函数等等。因此跑了359ms(g++)43ms(c++)。
。
囧。重度追求效率的童鞋可无视。本代码重在谈思路。
#include<iostream>
#include<queue>
#include<vector>
#include<cstdio>
#include<cstring>
using namespace std;
const int max_size=10001;
int n,m;
int head[max_size];
int in[max_size];
int reward[max_size];
queue<int> q;
struct Edge
{
int to;
int next;
Edge(){};
Edge(int i,int j):to(i),next(j){};
};
Edge edges[max_size*2];
void add(int i,int j)
{
static int k=0;
edges[k].to=j;
edges[k].next=head[i];
head[i]=k++;
if(k==m)
k=0;
}
void topo()
{
for(int i=1;i<=n;i++)
{
if(in[i]==0)
{
reward[i]=0;
q.push(i);
}
}
int top;
int to;
while(!q.empty())
{
top=q.front();
q.pop();
for(int k=head[top];k!=-1;k=edges[k].next)
{
to = edges[k].to;
in[to]--;
if(in[to]==0)
q.push(to);
reward[to]=reward[top]+1;//多1块钱即可了。 。
}
}
int sum=n*888;
for(int i=1;i<=n;i++)
{
if(reward[i]<0)
{
cout<<-1<<endl;//假设奖金(工资)数组reward中还有-1存在,说明有环。
return;
}
sum+=reward[i];
}
cout<<sum<<endl;
}
int main()
{
int i,j;
while(cin>>n>>m)
{
memset(in,0,sizeof in);
memset(head,-1,sizeof head);
memset(reward,-1,sizeof reward);
for(int t=0;t<m;t++)
{
cin>>i>>j;
add(j,i);
in[i]++;
}
topo();
}
}
hdu2647 逆拓扑,链式前向星。的更多相关文章
- HDU-2647 Reward(链式前向星+拓扑排序)
Reward Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- 最短路 spfa 算法 && 链式前向星存图
推荐博客 https://i.cnblogs.com/EditPosts.aspx?opt=1 http://blog.csdn.net/mcdonnell_douglas/article/deta ...
- POJ 3169 Layout(差分约束+链式前向星+SPFA)
描述 Like everyone else, cows like to stand close to their friends when queuing for feed. FJ has N (2 ...
- poj-1459-最大流dinic+链式前向星-isap+bfs+stack
title: poj-1459-最大流dinic+链式前向星-isap+bfs+stack date: 2018-11-22 20:57:54 tags: acm 刷题 categories: ACM ...
- # [Poj 3107] Godfather 链式前向星+树的重心
[Poj 3107] Godfather 链式前向星+树的重心 题意 http://poj.org/problem?id=3107 给定一棵树,找到所有重心,升序输出,n<=50000. 链式前 ...
- 模板 Dijkstra+链式前向星+堆优化(非原创)
我们首先来看一下什么是前向星. 前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序, 并记录下以某个点为起点的所有边在数组中的起始位置和 ...
- 链式前向星+SPFA
今天听说vector不开o2是数组时间复杂度常数的1.5倍,瞬间吓傻.然后就问好的图表达方式,然后看到了链式前向星.于是就写了一段链式前向星+SPFA的,和普通的vector+SPFA的对拍了下,速度 ...
- 单元最短路径算法模板汇总(Dijkstra, BF,SPFA),附链式前向星模板
一:dijkstra算法时间复杂度,用优先级队列优化的话,O((M+N)logN)求单源最短路径,要求所有边的权值非负.若图中出现权值为负的边,Dijkstra算法就会失效,求出的最短路径就可能是错的 ...
- 图的存储结构:邻接矩阵(邻接表)&链式前向星
[概念]疏松图&稠密图: 疏松图指,点连接的边不多的图,反之(点连接的边多)则为稠密图. Tips:邻接矩阵与邻接表相比,疏松图多用邻接表,稠密图多用邻接矩阵. 邻接矩阵: 开一个二维数组gr ...
随机推荐
- 《C语言深度解剖》面试题整理
请在40分钟内完成以下20道C语言基础题.在没有任何提示的情况下,如果能得满分,那么你可以扔掉本书了,你的水平已经大大超过了作者:如果能的80分以上,说明你的C语言基础还不错,学习本书可能会比较轻松: ...
- .cmd文件与.bat文件
.cmd文件与.bat文件的区别 包括ASSOC.FTYPE.APPEND.PATH.PROMPT.SET等6个命令在.bat和命令行环境下与.cmd环境下的执行表现不尽相同在.cmd环境下这些命令无 ...
- transition与animation
以前,一直都知道,transition是animation的一个简化版,甚至不算是动画,而是一种过渡. transition的用法 早两天用transition写了一个按钮滑动的效果,类似于IOS的设 ...
- 用 Asterisk 搭建自己的免费 VoIP 服务器
原文 http://www.yaoblog.info/?p=5021 1. 这里以 Debian 为例子,安装 Asterisk apt-get update apt-get install aste ...
- 小W与网格
lucas定理 http://www.cnblogs.com/vongang/archive/2012/12/02/2798138.html 题目:http://hihocoder.com/conte ...
- 组件接口(API)设计指南[4]-通知(Notifications)
*返回文件夹阅读其它章节: http://blog.csdn.net/cuibo1123/article/details/39894477 通知(Notifications) 通知是托付协议的还有一半 ...
- Oracle_Database_11g_标准版_企业版__下载地址_详细列表
Oracle_Database_11g_标准版_企业版__下载地址_详细列表 Oracle Database 11g Release 2 Standard Edition and Enterprise ...
- No enclosing instance of type Hello is accessible
1.static 关键字 修饰的成员被所有对象共享(包括成员变量和方法). 修饰的成员优先于对象存在. 存储于方法区(共享数据区)的静态区中. 静态方法只能访问静态成员. 静态方法中不可以使用this ...
- linux shell脚本:在脚本中实现读取键盘输入,根据输入判断下一步的分支
echo please input “runbip” to run bip. variableName="null" while [ $variableName != " ...
- EL表达式(1)
JSP页面中支持使用EL表达式,EL全名为Expression Language.EL表达式的主要作用有: ① 获取数据: ② 执行运算: ③ 使用EL表达式的11大隐式对象: ④ 调用Java方法. ...