1179: [Apio2009]Atm

Time Limit: 15 Sec  Memory Limit: 162 MB
Submit:
2407  Solved: 993
[Submit][Status][Discuss]

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的单向的道路到达其中的至少一个酒吧。

Source

Solution

挺不错的结合,挺好实现的

首先题目中有环,很显然换上的都可以取到,但这不符合一般的最短/长路的跑法,所以考虑转化

把图中的环缩成一个点,点权为环上的值总和,对缩出来的点重构图,连边

很显然是个DAG,那么如此这样就可以直接跑了,直接上SPFA跑一遍即可,实际上BFS也可以..

最后枚举所有的酒吧,判断在哪里结束获得最大即可

PS:开始重建图的时候,是在原来的基础上建的,为什么RE成狗?迫使我新开一个重新建...

启发:

有向图出现环,很有可能需要缩成点,这个思想可以应用与最短路,或者网络流上

想题要周到,方便实现的写法,往往最适合

遇到DAG时,尝试利用一下DAG的性质,可能会有奇效

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define maxn 500010
int read()
{
int x=,f=; char ch=getchar();
while (ch<'' || ch>'') {if (ch=='-') f=-; ch=getchar();}
while (ch>='' && ch<='') {x=x*+ch-''; ch=getchar();}
return x*f;
}
int n,m,uu,S,P,ans,val[maxn]; struct Edgenode{int to,next,val;}edge[maxn<<];
int head[maxn<<],cnt=;
void add(int u,int v)
{cnt++;edge[cnt].to=v;edge[cnt].next=head[u];head[u]=cnt;}
struct Roadnode{int to,next;}road[maxn];
int last[maxn],cn=;
void insert(int u,int v)
{cn++;road[cn].to=v;road[cn].next=last[u];last[u]=cn;}
int dfn[maxn],low[maxn],qcnt,stack[maxn],top,num[maxn],belong[maxn],tot,valu[maxn];
bool visit[maxn]; void Tarjan(int x)
{
dfn[x]=low[x]=++tot;
visit[x]=; stack[++top]=x;
for (int i=head[x]; i; i=edge[i].next)
{
if (!dfn[edge[i].to])
{
Tarjan(edge[i].to);
if (low[edge[i].to]<low[x]) low[x]=low[edge[i].to];
}
else
if(visit[edge[i].to] && dfn[edge[i].to]<low[x])
low[x]=dfn[edge[i].to];
}
if (dfn[x]==low[x])
{
qcnt++;
while (x!=uu)
uu=stack[top--],num[qcnt]++,visit[uu]=,belong[uu]=qcnt,valu[qcnt]+=val[uu];
}
}
void rebuild()
{
for (int i=; i<=n; i++)
for (int j=head[i]; j; j=edge[j].next)
if (belong[i]!=belong[edge[j].to])
insert(belong[i],belong[edge[j].to]);
}
#define inf 0x7fffffff
int dis[maxn];
void spfa()
{
queue<int>que; memset(visit,,sizeof(visit));
// for (int i=1; i<=qcnt; i++) dis[i]=-inf;
visit[S]=; dis[S]=valu[S]; que.push(S);
while (!que.empty())
{
int now=que.front(); que.pop(); visit[now]=;
for (int i=last[now]; i; i=road[i].next)
if (dis[road[i].to]<dis[now]+valu[road[i].to])
{
dis[road[i].to]=dis[now]+valu[road[i].to];
if (!visit[road[i].to])
visit[road[i].to]=,que.push(road[i].to);
}
}
}
bool bar[maxn];
int main()
{
n=read(),m=read();
for (int u,v,i=; i<=m; i++) u=read(),v=read(),add(u,v);
for (int i=; i<=n; i++) val[i]=read();
for (int i=; i<=n; i++) if (!dfn[i]) Tarjan(i);
S=read(); S=belong[S]; P=read();
for (int x,i=; i<=P; i++) x=read(),bar[x]=;
rebuild(); spfa();
// for (int i=1; i<=n; i++)
// printf("%d\n",dis[belong[i]]);
for (int i=; i<=n; i++)
if (bar[i]) ans=max(ans,dis[belong[i]]);
printf("%d\n",ans);
return ;
}

似乎是个不错的NOIP难度题?

【BZOJ-1179】Atm Tarjan + SPFA的更多相关文章

  1. bzoj 1179[Apio2009]Atm (tarjan+spfa)

    题目 输入 第一行包含两个整数N.M.N表示路口的个数,M表示道路条数.接下来M行,每行两个整数,这两个整数都在1到N之间,第i+1行的两个整数表示第i条道路的起点和终点的路口编号.接下来N行,每行一 ...

  2. BZOJ 1179: [Apio2009]Atm( tarjan + 最短路 )

    对于一个强连通分量, 一定是整个走或者不走, 所以tarjan缩点然后跑dijkstra. ------------------------------------------------------ ...

  3. 【BZOJ 1179】[Apio2009]Atm

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] tarjan强连通缩点一下. 然后把缩点之后,每个点的钱的数累加起来. 然后从S出发 开始一边做bfs一遍做dp. 最后输出有酒吧的 ...

  4. 【BZOJ 1150】 1150: [CTSC2007]数据备份Backup (贪心+优先队列+双向链表)

    1150: [CTSC2007]数据备份Backup Description 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味 的,因此你想设 ...

  5. Kruskal算法及其类似原理的应用——【BZOJ 3654】tree&&【BZOJ 3624】[Apio2008]免费道路

    首先让我们来介绍Krukal算法,他是一种用来求解最小生成树问题的算法,首先把边按边权排序,然后贪心得从最小开始往大里取,只要那个边的两端点暂时还没有在一个联通块里,我们就把他相连,只要这个图里存在最 ...

  6. 【BZOJ 2957】楼房重建&&Codechef COT5 Count on a Treap&&【NOIP模拟赛】Weed 线段树的分治维护

    线段树是一种作用于静态区间上的数据结构,可以高效查询连续区间和单点,类似于一种静态的分治.他最迷人的地方在于“lazy标记”,对于lazy标记一般随我们从父区间进入子区间而下传,最终给到叶子节点,但还 ...

  7. LCA 【bzoj 4281】 [ONTAK2015]Związek Harcerstwa Bajtockiego

    [bzoj 4281] [ONTAK2015]Związek Harcerstwa Bajtockiego Description 给定一棵有n个点的无根树,相邻的点之间的距离为1,一开始你位于m点. ...

  8. 【BZOJ1179】[Apio2009]Atm (tarjan+SPFA)

    显而易见的tarjan+spfa...不解释了 ; type edgetype=record toward,next:longint; end; var edge1,edge2:..maxn] of ...

  9. BZOJ 1179 [Apio2009]Atm(强连通分量)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1179 [题目大意] 给出一张有向带环点权图,给出一些终点,在路径中同一个点的点权只能累 ...

随机推荐

  1. PAT 1009. 说反话 (20) JAVA

    给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出. 输入格式:测试输入包含一个测试用例,在一行内给出总长度不超过80的字符串.字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区 ...

  2. JavaScript Date对象 日期获取函数

    JavaScript Date对象使用小例子: 运行结果: 总结: 1.尽管我们认为12月是第12个月份,但是JavaScript从0开始计算月份,所以月份11表示12月: 2.nowDate.set ...

  3. js,onblur后下一个控件获取焦点判断、html当前活跃控件、jquery版本查看、jquery查看浏览器版本、setTimeout&setInterval

    需求: input控件在失去焦点后直接做验证,验证通不过的话,显示相应错误.但是如果失去焦点后点击的下个控件是比较特殊的控件(比如,退出系统),那么不执行验证操作,直接退出系统(防止在系统退出前,还显 ...

  4. P3369 【模板】普通平衡树(Treap/SBT)

    题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(若有多个相同的数,因输出最小的排名) 查询 ...

  5. Oracle PL/SQL 入门

    PL/SQL 全称:Procedure Language/SQL.产生背景自己去百度. 模板: Declare ---变量定义 num ; name ) := 'damon'; idesc cnt_i ...

  6. 为什么带网格(mesh)的模型添加了刚体Rigidbody和MeshCollider,还是会从地板穿过去?

    两个Gameobject 放置在空中, 一个是Cube,一个是茄子模型 Cube的Collider 是Box Collider , 茄汁的Collider 是mesh collider, 他们都添加了 ...

  7. UltraEdit 编译输出中文乱码的解决办法

    配置UE的时候,都告诉大家javac   %n%e 接可以了,但是再运行的时候,会出现乱码,再加上-J-Duser.language=GBK就可以了,也就是下面的样子. javac -J-Duser. ...

  8. myeclipse 连接svn服务器验证位置时发生错误 404 forbidden

    来源于:https://my.oschina.net/softwarechina/blog/220300 网上有文章说是C:\Users\thinkpad\AppData\Roaming\Subver ...

  9. java之自定义回调接口

    本质上为:传递不同的实现的接口实例,执行不同的程序,即有扩展性. 在一个方法中,可以实现一个对象中的接口,实例化该接口,即可完成对不同对象的不同回掉. 在原有类中,调用接口中的方法,根据不同的接口实例 ...

  10. 开发错误12:gradle编译错误:Conflict with dependency com.android.support:support-annotations

    在build.gradle中的configurations.all {}下添加:resolutionStrategy.force 'com.android.support:support-annota ...