---恢复内容开始---

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

47

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)的更多相关文章

  1. Java测试笔记(ATM)

    本次Java测试主要是做一个与ATM相似的系统,用文本文件来作为用户数据库,实现存款.取款.转账.修改密码.查询余额的功能.在做这次测试之前老师并没有讲解与Java相关的知识,所以这就需要我们自学Ja ...

  2. 网络基础篇之HDLC、PPP(原理)

    一.广域网传输 之前讲解的都是关于局域网的数据传输,这次讲解的是广域网的传输. 广域网简称WAN,是一种跨越超大的.地域性的计算机网络集合.通常跨省.市.甚至一个国家.广域网包括很多子网,子网可以是局 ...

  3. 大话JS面向对象之开篇万物皆对象------(ATM取款机引发的深思)

    一,总体概要 OO(面向对象)概念的提出是软件开发工程发展的一次革命,多年来我们借助它使得很多大型应用程序得以顺利实现.如果您还没有掌握并使用OO进行程序设计和开发,那么您无疑还停留在软件开发的石器时 ...

  4. Java 模拟ATM(修正)

    ATM机的账户记录Account有账户的唯一性标识(11个长度的字符和数字的组合),用户的姓名,操作日期(Date),操作类型,账户密码(六位的数字,可以用0开头),当前的余额(可以为0). 模拟AT ...

  5. p3627&bzoj1179 抢掠计划(ATM)

    传送门(洛谷) 传送门(bzoj) 题目 Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruser i 银行的 ATM 取款机.令人奇怪的 ...

  6. MySQL银行ATM存取款机系统(需求分析)

    银行ATM需求文档 一.E-R图形文 二.开发步骤 1.明确需求--数据库设计--编码实现功能--测试 2.绘制e-r图--绘制数据库模型图--使用三大方式规范数据库结构 三.开发思路 1. 模型图综 ...

  7. day26 作业(ATM第二版)

    目录 start.py conf.settings.py core.src.py db.db_handler.py interface.bank_interface.py interface.shop ...

  8. ATM管理系统(三)

    一.作业信息 博客班级 软件工程 作业要求 作业要求 作业目标 你理解的作业目标具体内容 学号 3180701218 二.题目要求 编写一个ATM管理系统,语言不限,要求应包括以下主要功能:(1)开户 ...

  9. linux 下用C实现 ATM 自动取款机功能 (进程间通信)

    直接先上图: 项目需求: 主要分为两人大模块: 客户端 .进入时的功能开户.销户.登录.解锁 开户:输入姓名.身份证号.设置密码,如果开户成功,则服务器上保存一个账号信号(一个账号存一个文件,文件名建 ...

随机推荐

  1. iOS如何监听弱网?

    场景: iOS中我们可能经常用到监听网络,不过大部分是监听网络的类型,即2G/3G/4G WIFI,是否连接网络,然而测试人员对APP进行测试时候经常会有一个弱网测试,即在弱网环境下对APP进行测试, ...

  2. DIOCP之开发流程图之Client

    本次分析开发流程图采用的是DIOCP群里的群友[彩蛋]所给的DEMO,依然是win7的画图作品. 本人分析认为:学习网络开发不同本地开发,首先你应该知道完整的开发流程即网络程序运行的先后顺序,有个整体 ...

  3. (转)maven配置之pom.xml配置

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

  4. PO、VO、BO、DTO、POJO、DAO

    J2EE开发中大量的专业缩略语很是让人迷惑,尤其是跟一些高手讨论问题的时候,三分钟就被人家满口的专业术语喷晕了,PO VO BO DTO POJO DAO,一大堆的就来了(听过老罗对这种现象的批判的朋 ...

  5. linux 定时执行php脚本

    第一种方法: 1.编写shell脚本: shell文件:/home/www/shell/phpshell.php #!/bin/bash while [ true ]; do /bin/sleep 1 ...

  6. String类的构造方法详解

    package StringDemo; //String类的构造方法详解 //方法一:String(); //方法二:String(byte[] bytes) //方法三:String (byte[] ...

  7. 转-servlet 获取 post body 体用流读取为空的问题

    目前基于rest风格的很多API开始使用通过body data来传输来代替之前的key-value传输方式.在Java servlet或者springmvc中可以通过如下代码来获取并图片通过流方式传输 ...

  8. php js 排序

     编写背景及排序 规则 公司需要对游戏进行一系列的排序,在这里只说我自己遇到问题的哪一段 //规则:$plat数据要根据$sort里的sort为相应 可以输入一个数字,即为该平台: 解决思路:将$so ...

  9. TopShelf框架创建Windows服务作为Remoting的宿主案例:

    1.创建服务 using System; using System.Collections.Generic; using System.Linq; using System.Text; using S ...

  10. ギリギリ eye (优先队列)

    1.题目: [题目描述] A.D.1999,由坠落地球的"谜之战舰"带来的 Over Technology,揭示了人类历史和远 古文明之间的丝丝联系,促使人类终止彼此间的战争,一方 ...