【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 ...
随机推荐
- spring+spring mvc+JdbcTemplate 入门小例子
大家使用这个入门时候 最好能够去 搜一下 spring mvc 的 原理,我放一张图到这里,自己琢磨下,后面去学习就容易了 给个链接 (网上一把,千万不能懒) https://www.cnblo ...
- html js点击按钮滚动跳转定位到页面指定位置(DIV)的方法代码
一:通过html锚点实现滚动定位到页面指定位置(DIV): 如果我们要点击实现跳转的地方是一个html锚点,也就是点击一个A标签超链接实现跳转,可以把A标签的href属性直接指向跳转指定位置的d ...
- Java入门系列(六)方法
方法返回多个值 使用集合类 /** * 方法1:使用集合类 (Map以外的集合类也可以随意使用) * 目标:返回一个数组的最大值和最小值 */ public Map<String, Intege ...
- J2EE架构
从整体上讲,J2EE是使用Java技术开发企业级应用的一种事实上的工业标准(Sun公司出于其自身利益的考虑,至今没有将Java及其相关技术纳入标准化组织的体系),它是Java技术不断适应和促进企业级应 ...
- [python]python错误集锦
ValueError: invalid literal : ''不能将非数字字符串转换为整型 object has no attribute 对象调用一个没有的方法(内建或自定义) TypeError ...
- github for Mac 教程
Mac系统自带git,所有我们使用Mac搬的github客户端,无需安装git,所以使用github for Mac 超级简单,下载安装就好了. 1github for Mac 下载地址:https: ...
- CString 与其它数据类型转换问题
CString 头文件#include <afx.h> string 头文件#include <string.h> CString 转char * CString cstr; ...
- C# 文件Copy
文件Copy有以下几种方法: 1.Copy string sourceFile = @"c:\temp\New Text Document.txt"; string destina ...
- 数链剖分(Tree)
题目链接:https://cn.vjudge.net/contest/279350#problem/D 题目大意:操作,单点查询,区间取反,询问区间最大值. AC代码: #include<ios ...
- elasticsearch安装marvel插件
Marvel插件要在Elasticsearch和Kibana中同时安装.Step 1: Install Marvel into Elasticsearch: bin/plugin install li ...