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 ...
随机推荐
- django-form表单的提交
<form action="/blog/" method="get"> 如果runserver默认启用127.0.0.1:8000的话,且上面这个f ...
- SignalR系列教程:服务器广播与主动数据推送
本篇是本系列入门篇的最后一遍,由于工作关系,接触SignalR的时间不是很多.等下次有空的话我会写一个利用“SignalR”开发一个在线聊天室的系列博文.近期的话我更偏向于更新框架设计相关的文章,到时 ...
- char s[]字串和char *s字串有什麼区别?
C語言有兩種字串宣告方式char s[]和char *s,兩者有什麼差異呢? Introduction char s[] = "Hello World"; (只是用字符串常量初始化 ...
- html submit 登录
<!doctype html> <html lang="en"> <head> <meta name="Generator&qu ...
- hdu4620 Fruit Ninja Extreme
Fruit Ninja Extreme Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- Oracle管道函数(Pipelined Table Function)介绍
一 概述: 1.管道函数即是能够返回行集合(能够使嵌套表nested table 或数组 varray)的函数,我们能够像查询物理表一样查询它或者将其 赋值给集合变量. 2.管道函数为并行运行,在普 ...
- response.sendRedirect("")和request.getRequestDispatcher("").forward(req,resp);
1:request.getRequestDispatcher("转发路径").forward(req,resp)该语句是实现请求转发的,当请求进入到该servlet中执行到该语句时 ...
- 【linux】内核+文件系统下载到开发板
K开发 欢迎转载,转载时请保留作者信息,谢谢. 邮箱:tangzhongp@163.com 博客园地址:http://www.cnblogs.com/embedded-tzp Csdn博客地址:htt ...
- Java内部类——成员内部类
成员内部类的意思就是,一个外层类里面包含着一个非static的class,举例如下: class OuterClass { //变量,函数定义... class InnerClass { //变量,函 ...
- cocos2dx3.2 异步载入和动态载入
半个月没有更新博客,从这个项目開始学习了非常多细节的东西,都不太成系统.可是却是开发上线中必须经历的东西.比方超级玛丽系列(一)中的正确的异步载入,正确的分层.正确的合成和载入plist.及时的移除未 ...