hdu2647 逆拓扑,链式前向星。

简介:

原文地址


题目分析

题意

老板发工资,可是要保证发的工资数满足每一个人的期望,比方A期望工资大于B,仅仅需比B多1元钱就可以。老板发的最低工资为888元。输出老板最少发的工资总数。若是无法满足大家的期望,则输出-1。

分析

非常明显这是一个拓扑问题。若存在环则无法满足大家的期望。若按常理,A>B,则可能会建立A指向B的有向边。此题不然,由于我们仅仅知道最少的钱数是888,所以从小到大进行拓扑排序更为恰当。所以是建立B指向A的有向边。

此之为逆拓扑排序。由于这样处理后排序的结果与原先拓扑排序的顺序相反。

以图论观点来看,若为邻接矩阵存储就视作了矩阵的逆置。

链式前向星

链式前向星是图的一种存储方式,事实上质是邻接表的静态存储。

关于链式前向星的很多其它介绍。可移步《深度理解链式前向星》

吐槽,链式前向星并不是学术上的术语,貌似是国内网友的起名智慧。。因此国外没有这种术语。只是这个词在国内还是有认可度的。

我的代码

用了点小技巧,比方static变量。还有重载构造函数等等。因此跑了359ms(g++)43ms(c++)。

囧。重度追求效率的童鞋可无视。本代码重在谈思路。

 

。 } } 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(); } }

















本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5123623.html,如需转载请自行联系原作者
相关文章
|
3月前
没有给出二分图两个左右点集时的二分图最大匹配
没有给出二分图两个左右点集时的二分图最大匹配
12 0
|
17天前
|
算法 测试技术 C#
【图论】 【割点】 【双连通分类】LCP 54. 夺回据点
【图论】 【割点】 【双连通分类】LCP 54. 夺回据点
|
3月前
|
NoSQL 容器 消息中间件
图、图的遍历及图的拓扑排序
图、图的遍历及图的拓扑排序
|
8月前
|
算法
图论:Voronoi图
图论:Voronoi图
101 0
|
8月前
UVa10075 - Airlines(所有点对之间的最短距离)
UVa10075 - Airlines(所有点对之间的最短距离)
21 0
|
10月前
|
存储 算法 搜索推荐
拓扑排序:求取拓扑序列
拓扑排序简单讲就是在可求拓扑序列的有向无回路图(有向无环图)中求取拓扑序列的排序算法。通俗讲就是按活动的先后次序进行排序的序列,并且每一个顶点只出现一次,它可以表述出完成某一项活动所需要的前置活动
54 0
拓扑排序:求取拓扑序列
|
11月前
|
存储
搜索与图论-有向图的拓扑序列
搜索与图论-有向图的拓扑序列
|
存储 算法 C++
C++实现图 - 03 最小生成树
这一讲来讲一个图中非常重要的内容 —— 最小生成树,在此之前我们先来回顾一下生成树的概念。
182 0
C++实现图 - 03 最小生成树
|
存储 算法 Java
【每日算法】用树建图,求距离目标节点为 k 的点集的两种方式:「建图 + BFS」&「建图 + 迭代加深」 |Python 主题月
【每日算法】用树建图,求距离目标节点为 k 的点集的两种方式:「建图 + BFS」&「建图 + 迭代加深」 |Python 主题月