【tarjan+SPFA】BZOJ1179-[Apio2009]Atm
【题目大意】
给出一张有点权的有向图,已知起点和可以作为终点的一些点,问由起点出发,每条边和每个点可以经过任意多次,经过点的权值总和最大为多少。
【思路】
由于可以走任意多次,显然强连通分量可以缩点。然后就是一张DAG图,跑SPFA最长路就好了。
听说Dijkstra写最长路会发生一些奇特的化学反应并且炸掉,还没想清楚姑且笔记一下。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=+;
struct edge
{
int to,len;
};
int n,m,s,p,money[MAXN],bar[MAXN],u[MAXN],v[MAXN];
vector<int> E[MAXN];
vector<edge> rE[MAXN];
stack<int> S;
queue<int> que;
int instack[MAXN],low[MAXN],dfn[MAXN],sum[MAXN],col[MAXN],cnt,tot;
int dis[MAXN],inque[MAXN]; void addedge(int u,int v)
{
E[u].push_back(v);
} void addedge2(int u,int v,int w)
{
rE[u].push_back((edge){v,w});
} void tarjan(int x)
{
dfn[x]=low[x]=++cnt;
instack[x]=;
S.push(x);
for (int i=;i<E[x].size();i++)
{
int to=E[x][i];
if (!instack[to])
{
tarjan(to);
low[x]=min(low[x],low[to]);
}
else if (instack[to]==)
{
low[x]=min(low[x],dfn[to]);
}
} if (dfn[x]==low[x])
{
tot++;
int tmp;
do
{
tmp=S.top();S.pop();
sum[tot]+=money[tmp];
col[tmp]=tot;
instack[tmp]=;
}while (tmp!=x);
}
} void spfa(int start)
{
memset(inque,,sizeof(inque));
for (int i=;i<=tot;i++) dis[i]=;
dis[start]=sum[start];
inque[start]=;
que.push(start);
while (!que.empty())
{
int head=que.front();que.pop();
inque[head]=;
for (int i=;i<rE[head].size();i++)
{
int to=rE[head][i].to,len=rE[head][i].len;
if (dis[to]<dis[head]+len)
{
dis[to]=dis[head]+len;
if (!inque[to])
{
inque[to]=;
que.push(to);
}
}
}
}
} void rebuild()
{
for (int i=;i<=m;i++)
if (col[u[i]]!=col[v[i]]) addedge2(col[u[i]],col[v[i]],sum[col[v[i]]]);
} void init()
{
scanf("%d%d",&n,&m);
for (int i=;i<=m;i++)
{
scanf("%d%d",&u[i],&v[i]);
addedge(u[i],v[i]);
}
for (int i=;i<=n;i++) scanf("%d",&money[i]);
memset(bar,,sizeof(bar));
scanf("%d%d",&s,&p);
for (int i=;i<=p;i++)
{
int nowp;
scanf("%d",&nowp);
bar[nowp]=;
}
} void solve()
{
cnt=tot=;
memset(instack,,sizeof(instack));
for (int i=;i<=n;i++)
if (!instack[i]) tarjan(i);
rebuild();
spfa(col[s]);
int ans=-;
for (int i=;i<=n;i++)
if (bar[i]) ans=max(ans,dis[col[i]]);
printf("%d",ans);
} int main()
{
init();
solve();
return ;
}
【tarjan+SPFA】BZOJ1179-[Apio2009]Atm的更多相关文章
- 【强连通分量+spfa】Bzoj1179 Apio2009 Atm
Description Solution 显然缩强连通分量,然后求最长路,虽然是DAG但还是有点麻烦,于是用了spfa. Code 重建图_数组写错好多次,感觉做这题也就是练了一下实现. #inclu ...
- 【强联通分量缩点】【最短路】【spfa】bzoj1179 [Apio2009]Atm
缩点后转化成 DAG图上的单源最长路问题.spfa/dp随便. #include<cstdio> #include<queue> #include<algorithm&g ...
- bzoj 1179: [Apio2009]Atm【tarjan+spfa】
明明优化了spfa还是好慢-- 因为只能取一次值,所以先tarjan缩点,把一个scc的点权和加起来作为新点的点权,然后建立新图.在新图上跑spfa最长路,最后把酒吧点的dis取个max就是答案. # ...
- 缩点+spfa最长路【bzoj】 1179: [Apio2009]Atm
[bzoj] 1179: [Apio2009]Atm Description Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri ...
- BZOJ1179 [Apio2009]Atm 【tarjan缩点】
1179: [Apio2009]Atm Time Limit: 15 Sec Memory Limit: 162 MB Submit: 4048 Solved: 1762 [Submit][Sta ...
- BZOJ1179 : [Apio2009]Atm 缩点+spfa
1179: [Apio2009]Atm Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 2069 Solved: 826[Submit][Status ...
- 【tarjan+拓扑】BZOJ3887-[Usaco2015 Jan]Grass Cownoisseur
[题目大意] 给一个有向图,然后选一条路径起点终点都为1的路径出来,有一次机会可以沿某条边逆方向走,问最多有多少个点可以被经过?(一个点在路径中无论出现多少正整数次对答案的贡献均为1) [思路] 首先 ...
- 【BZOJ】1179: [Apio2009]Atm(tarjan+spfa)
http://www.lydsy.com/JudgeOnline/problem.php?id=1179 缩点建图... #include <cstdio> #include <cs ...
- bzoj1179: [Apio2009]Atm 【缩点+spfa最长路】
题目传送门 Description Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruser i 银行的 ATM 取款机.令人奇怪的是,S ...
随机推荐
- yearProgress.vue
<template> <div class="progressbar"> <el-progress :text-inside="true&q ...
- JAVA记录-Servlet RequestDispatcher请求转发
RequestDispatcher接口提供将请求转发送到另一个资源的功能,它可能是html,servlet或jsp等. 此接口也可用于包括另一资源的内容.它是servlet协作的一种方式. 在Requ ...
- Solr记录-solr内核与索引
Solr核心(内核) Solr核心(Core)是Lucene索引的运行实例,包含使用它所需的所有Solr配置文件.我们需要创建一个Solr Core来执行索引和分析等操作. Solr应用程序可以包含一 ...
- 何凯文每日一句打卡||DAY12
- android studio run的时候一直卡在waiting for debug
原因如下: 选择ok就可以,同时我们也可以从这里找到 平常遇到跟真机有关的问题,三步大法,1,插拔手机,2.adb kill-server;adb start-server 3.重启as
- 从ACM会议分析我国计算机科学近十年发展情况
从ACM会议分析我国计算机科学近十年发展情况 来源:<中国计算机学会通讯>2015年第10期<专栏> 作者:陈 钢 2006年,承蒙李国杰院士推荐,<中国计算机学会通讯& ...
- 【51Nod】1273 旅行计划 树上贪心
[题目]51Nod 1273 旅行计划 [题意]给定n个点的树和出发点k,要求每次选择一个目的地旅行后返回,使得路径上未访问过的点最多(相同取编号最小),旅行后路径上所有点视为访问过,求旅行方案.\( ...
- RabbitMQ Queue一些常见模式
懒队列:lazy Queue,即用到的时候才会加载,3.6.0及之后新添加的.当新添加数据后,不会将其放入到内存中,而是将其放入到磁盘中. 普通队列:1).in-memory,数据直接放入到内存中. ...
- 【Alsa】播放声音和录音详细流程
linux中,无论是oss还是alsa体系,录音和放音的数据流必须分析清楚.先分析alsa驱动层,然后关联到alsa库层和应用层. 二,链接分析: 1)链路一 usr/src/linux-source ...
- Linux网络状态工具ss命令使用详解【转】
ss命令用于显示socket状态. 他可以显示PACKET sockets, TCP sockets, UDP sockets, DCCP sockets, RAW sockets, Unix dom ...