【题目大意】

给出一张有点权的有向图,已知起点和可以作为终点的一些点,问由起点出发,每条边和每个点可以经过任意多次,经过点的权值总和最大为多少。

【思路】

由于可以走任意多次,显然强连通分量可以缩点。然后就是一张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的更多相关文章

  1. 【强连通分量+spfa】Bzoj1179 Apio2009 Atm

    Description Solution 显然缩强连通分量,然后求最长路,虽然是DAG但还是有点麻烦,于是用了spfa. Code 重建图_数组写错好多次,感觉做这题也就是练了一下实现. #inclu ...

  2. 【强联通分量缩点】【最短路】【spfa】bzoj1179 [Apio2009]Atm

    缩点后转化成 DAG图上的单源最长路问题.spfa/dp随便. #include<cstdio> #include<queue> #include<algorithm&g ...

  3. bzoj 1179: [Apio2009]Atm【tarjan+spfa】

    明明优化了spfa还是好慢-- 因为只能取一次值,所以先tarjan缩点,把一个scc的点权和加起来作为新点的点权,然后建立新图.在新图上跑spfa最长路,最后把酒吧点的dis取个max就是答案. # ...

  4. 缩点+spfa最长路【bzoj】 1179: [Apio2009]Atm

    [bzoj] 1179: [Apio2009]Atm Description Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri ...

  5. BZOJ1179 [Apio2009]Atm 【tarjan缩点】

    1179: [Apio2009]Atm Time Limit: 15 Sec  Memory Limit: 162 MB Submit: 4048  Solved: 1762 [Submit][Sta ...

  6. BZOJ1179 : [Apio2009]Atm 缩点+spfa

    1179: [Apio2009]Atm Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 2069  Solved: 826[Submit][Status ...

  7. 【tarjan+拓扑】BZOJ3887-[Usaco2015 Jan]Grass Cownoisseur

    [题目大意] 给一个有向图,然后选一条路径起点终点都为1的路径出来,有一次机会可以沿某条边逆方向走,问最多有多少个点可以被经过?(一个点在路径中无论出现多少正整数次对答案的贡献均为1) [思路] 首先 ...

  8. 【BZOJ】1179: [Apio2009]Atm(tarjan+spfa)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1179 缩点建图... #include <cstdio> #include <cs ...

  9. bzoj1179: [Apio2009]Atm 【缩点+spfa最长路】

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

随机推荐

  1. POJ - 2513 Colored Sticks(欧拉通路+并查集+字典树)

    https://vjudge.net/problem/POJ-2513 题解转载自:優YoU  http://user.qzone.qq.com/289065406/blog/1304742541 题 ...

  2. HDU 3595 every-sg模型

    多个子游戏同时进行,每个子游戏给出两个数a,b,可以将大的数减去k倍小的数,不能操作者输. 策略就是对于一个必胜的游戏要使得步数更长,对于一个必败的游戏使得步数最短. 以下都来自贾志豪的论文.. 对于 ...

  3. javascript公有静态成员

    公共静态成员在javascript中并没有特殊语法来表示静态成员.但是可以通过使用构造函数向其添加属性这种方式. //构造函数 var Gadget = function(){}; //静态方法 Ga ...

  4. AngularJs -- 指令简介

    整理书籍内容(QQ:283125476 发布者:M [重在分享,有建议请联系->QQ号]) HTML文档 HTML文档是一个纯文本文件,包含了页面的结构以及由CSS定义的样式,或者可以操作样式的 ...

  5. codeforces 235 div2 A. Vanya and Cards

    Vanya loves playing. He even has a special set of cards to play with. Each card has a single integer ...

  6. CF359B Permutation (构造)

    CF359B Permutation \(solution:\) 作为一道构造题,这题也十分符合构造的一些通性----(找到一些规律,然后无脑循环). 构造一个长度为 \(2n\) 的排列 \(a\) ...

  7. RabbitMQ Headers Exchange示例

    (1).发布者 var connectionFactory = new ConnectionFactory() { HostName="192.168.205.128",UserN ...

  8. 【干货】Linux内存数据的获取与转存 直捣密码

    知识源:Unit 2: Linux/Unix Acquisition 2.1 Linux/Unix Acquistion Memory Acquisition 中的实验demo部分  小白注意,这是网 ...

  9. 关于阿里云和ucloud云服务器负载均衡器slb和ulb会话保持的配置

    在阿里云slb或者ucloud的ulb上对公司网站后台做了负载均衡以后,发现经常需要重新登录,单独访问没有这样的问题,问题就出在session的保持上,在云控制台中有配置会话的相关选项 阿里云的配置 ...

  10. asp.net防SQL/JS注入攻击:过滤标记

    /// <summary>/// 过滤标记/// </summary>/// <param name="NoHTML">包括HTML,脚本,数据 ...