bzoj1179(Atm)
---恢复内容开始---
1179: [Apio2009]Atm
Time Limit: 15 Sec Memory Limit: 162 MB
Description
Input
第一行包含两个整数N、M。N表示路口的个数,M表示道路条数。接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号。接下来N行,每行一个整数,按顺序表示每个路口处的ATM机中的钱数。接下来一行包含两个整数S、P,S表示市中心的编号,也就是出发的路口。P表示酒吧数目。接下来的一行中有P个整数,表示P个有酒吧的路口的编号
Output
输出一个整数,表示Banditji从市中心开始到某个酒吧结束所能抢劫的最多的现金总数。
Sample Input
6 7
1 2
2 3
3 5
2 4
4 1
2 6
6 5
10
12
8
16
1
5
1 4
4
3
5
6
Sample Output
HINT
50%的输入保证N, M<=3000。所有的输入保证N, M<=500000。每个ATM机中可取的钱数为一个非负整数且不超过4000。输入数据保证你可以从市中心沿着Siruseri的单向的道路到达其中的至少一个酒吧。
这道题写了好久,终于写出来啦(哭。。。。。)
这道题思路大概是这样的,用adjacency list存完边后,先做一个tarjan并染色的预处理,然后把所有相同颜色的城市看成一个强连通分量,把这个强连通分量的颜色设置为新的地图编号为color的一个城市,然后将记录下来的原先的城市的道路,一一判断是否在新的map中是一座城市,若不是,那重新建立道路。(当然也得重新设置酒吧的位置)
最后跑一遍spfa求出每个酒吧的最大值即可(因为把强连通分量看成了一个城市了,所以不会再产生环)。
还是一样,贴代码(其实后来发现有一点可以省略不写的,就是重新设置好城市以后,把酒吧原来所在城市的的编号改成现在的就行,,还多开了一个array)
#include<cstdio> #include<cstring> #include<algorithm> ; using namespace std; struct node {int next,aim;}; node f[maxn],e[maxn]; int point,head[maxn],Low[maxn],stack[maxn],DFN[maxn],dep,top,cl[maxn],color,queue[maxn],n,m,newmoney[maxn]; bool vis[maxn],bar[maxn],newbar[maxn]; int x1[maxn],y1[maxn],money[maxn],start,t; long long ans,d[maxn]; void add(node *array,int x,int y) { point++; array[point].next=head[x]; head[x]=point; array[point].aim=y; } void tarjan(int x) { DFN[x]=Low[x]=++dep;//为节点u设定次序编号和Low初值 stack[++top]=x; vis[x]=true; //将节点u压入栈中 ;i=e[i].next)//枚举每一条边 if (!DFN[e[i].aim]) {//如果节点v未被访问过 tarjan(e[i].aim);//继续向下找 Low[x]=min(Low[x],Low[e[i].aim]); } else if (vis[e[i].aim])//如果节点v还在栈内 Low[x]=min(Low[x],DFN[e[i].aim]); if (DFN[x]==Low[x])//如果节点u是强连通分量的根 { vis[x]=)cl[x]=++color; while(stack[top]!=x) { cl[stack[top]]=color; vis[stack[top]]=false; top--; } top--; } } void spfa(int x) { ,tail=; queue[Head]=x; while(Head<tail) { ;i=f[i].next) { int u=f[i].aim; if(d[queue[Head]]+newmoney[u]>d[u]) { d[u]=d[queue[Head]]+newmoney[u]; if(!vis[u])queue[tail++]=u; vis[u]=true; } } vis[queue[Head]]=false; Head++; } } int main() { scanf("%d%d",&n,&m); ;i<=m;i++) { scanf("%d%d",&x1[i],&y1[i]); add(e,x1[i],y1[i]); } ;i<=n;i++) { scanf("%d",&money[i]); } scanf("%d",&start); scanf("%d",&t); ;i<=t;i++) { int l; scanf("%d",&l); bar[l]=true; } ;i<=n;i++) if(!DFN[i])tarjan(i); memset(head,,sizeof(head)); point=; ;i<=m;i++) { int p=cl[x1[i]],q=cl[y1[i]]; if(p!=q)add(f,p,q); } ;i<=n;i++) newmoney[cl[i]]+=money[i]; start=cl[start]; ;i<=n;i++) { if(bar[i]){ newbar[cl[i]]=true; } } memset(vis,,sizeof(vis)); d[start]=newmoney[start]; vis[start]=true; spfa(start); ;i<=color;i++) if(newbar[i])ans=max(ans,d[i]); printf("%lld",ans); ; }
---恢复内容结束---
bzoj1179(Atm)的更多相关文章
- Java测试笔记(ATM)
本次Java测试主要是做一个与ATM相似的系统,用文本文件来作为用户数据库,实现存款.取款.转账.修改密码.查询余额的功能.在做这次测试之前老师并没有讲解与Java相关的知识,所以这就需要我们自学Ja ...
- 网络基础篇之HDLC、PPP(原理)
一.广域网传输 之前讲解的都是关于局域网的数据传输,这次讲解的是广域网的传输. 广域网简称WAN,是一种跨越超大的.地域性的计算机网络集合.通常跨省.市.甚至一个国家.广域网包括很多子网,子网可以是局 ...
- 大话JS面向对象之开篇万物皆对象------(ATM取款机引发的深思)
一,总体概要 OO(面向对象)概念的提出是软件开发工程发展的一次革命,多年来我们借助它使得很多大型应用程序得以顺利实现.如果您还没有掌握并使用OO进行程序设计和开发,那么您无疑还停留在软件开发的石器时 ...
- Java 模拟ATM(修正)
ATM机的账户记录Account有账户的唯一性标识(11个长度的字符和数字的组合),用户的姓名,操作日期(Date),操作类型,账户密码(六位的数字,可以用0开头),当前的余额(可以为0). 模拟AT ...
- p3627&bzoj1179 抢掠计划(ATM)
传送门(洛谷) 传送门(bzoj) 题目 Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruser i 银行的 ATM 取款机.令人奇怪的 ...
- MySQL银行ATM存取款机系统(需求分析)
银行ATM需求文档 一.E-R图形文 二.开发步骤 1.明确需求--数据库设计--编码实现功能--测试 2.绘制e-r图--绘制数据库模型图--使用三大方式规范数据库结构 三.开发思路 1. 模型图综 ...
- day26 作业(ATM第二版)
目录 start.py conf.settings.py core.src.py db.db_handler.py interface.bank_interface.py interface.shop ...
- ATM管理系统(三)
一.作业信息 博客班级 软件工程 作业要求 作业要求 作业目标 你理解的作业目标具体内容 学号 3180701218 二.题目要求 编写一个ATM管理系统,语言不限,要求应包括以下主要功能:(1)开户 ...
- linux 下用C实现 ATM 自动取款机功能 (进程间通信)
直接先上图: 项目需求: 主要分为两人大模块: 客户端 .进入时的功能开户.销户.登录.解锁 开户:输入姓名.身份证号.设置密码,如果开户成功,则服务器上保存一个账号信号(一个账号存一个文件,文件名建 ...
随机推荐
- Myeclipse中打开接口实现类的快捷键
Myeclipse中打开接口实现类的快捷键-----Ctrl + T Myeclipse中 Open Type快捷键-----Ctrl + Shift + T
- web前端之性能优化
作为一个前端工作人员,而且只会写点HTML5和CSS3的“假”前端工程师,为了能更好地理解一下前端的花花世界,最近拜读了<高性能网站建设指南>一书,对作者提出的前端性能优化的14个规则获益 ...
- 什么时候该用NoSQL?
: 杂谈 NoSQL这两年越来越热,尤其是大型互联网公司非常热衷这门技术.根据笔者的经验,并不是任何场景,NoSQL都要优于关系型数据库.下面我们来具体聊聊,什么时候使用NoSQL比较给力: 1) ...
- python数据统计,总数,平均值等
一般我们进行数据统计的时候要进行数据摸查,可能是摸查整体的分布情况啊.平均值,标准差,总数,各分段的人数啊.这时候用excel或者数据库统计都不方便. 我要统计的一个文件,太大了,还得分成15个文件, ...
- Android菜鸟成长记15 -- BitMap
BitMap简介 Bitmap是Android系统中的图像处理的最重要类之一.用它可以获取图像文件信息,进行图像剪切.旋转.缩放等操作,并可以指定格式保存图像文件.本文从应用的角度,着重介绍怎么用Bi ...
- switch语句下的变量声明和定义
switch语句下的变量声明和定义的问题: switch...case...语句中存在声明和定义会出现一些问题.这个由switch语法特性决定的, switch中每个case都是平等的层次,区别于一般 ...
- Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->Spring Framework的依赖注入和控制反转
Dependency Injection and Inversion of Control 1.概述: 1.1相关概念 bean:由IoC容器所管理的对象,也即各个类实例化所得对象都叫做bean 控制 ...
- 【POJ2482】Stars in Your Window(线段树,扫描线)
题意:在二维坐标系中有一些带权值的点,要求用一个长宽指定不能互换的框套住其中的一些,使得它们的权值和最大. n<=10000 x,y<=2^31 思路:首先按X排序,将Y坐标离散化,X坐标 ...
- linux中用户、组的管理(密码管理、权限管理及其修改用户、组)(转)
process(进程) 1 计算资源 权限 用户(获取资源或服务的凭证或标识) 用户,容器,关联权限:用户组(标识符),方便地指派权限 2 用户.组.权限 安全上下文(secure context ...
- Centos实现回收站机制
作为一个运维人员,在服务器上删除文件时为了方便经常会直接使用rm *.txt这类通配符,甚至为了省事加-rf参数,如果是确定的话还好,要是在删除的时候一个不留神,那事可就大了. 俗话说常在河边站哪有不 ...