题目链接:https://www.luogu.org/problemnew/show/P3627

把点权转化到边权上去。

#include <stack>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 500000 + 10;
const int inf = 0x7fffffff;
struct edge{
int from, to, next, len;
}e1[maxn<<2], e2[maxn<<2];
int head1[maxn], head2[maxn], cnt1, cnt2;
bool vis1[maxn], vis2[maxn];
int dfn[maxn], low[maxn], tim, color[maxn], num, dis[maxn];
int n, m, val1[maxn], val2[maxn], end, S, p, x[maxn], y[maxn], ans = -1;
stack<int> s;
queue<int> q;
void add1(int u, int v)
{
e1[++cnt1].from = u;
e1[cnt1].to = v;
e1[cnt1].next = head1[u];
head1[u] = cnt1;
}
void add2(int u, int v, int w)
{
e2[++cnt2].from = u;
e2[cnt2].to = v;
e2[cnt2].len = w;
e2[cnt2].next = head2[u];
head2[u] = cnt2;
}
void tarjan(int x)
{
dfn[x] = low[x] = ++tim;
s.push(x); vis1[x] = 1;
for(int i = head1[x]; i != -1; i = e1[i].next)
{
int v = e1[i].to;
if(!dfn[v])
{
tarjan(v);
low[x] = min(low[x], low[v]);
}
else if(vis1[v])
{
low[x] = min(low[x], low[v]);
}
}
if(dfn[x] == low[x])
{
color[x] = ++num;
vis1[x] = 0;
val2[num] += val1[x];
while(s.top() != x)
{
color[s.top()] = num;
vis1[s.top()] = 0;
val2[num] += val1[s.top()];
s.pop();
}
s.pop();
}
}
void SPFA()
{
for(int i = 1; i <= num; i++) dis[i] = inf;
dis[color[S]] = -1*val2[color[S]]; vis2[color[S]] = 1; q.push(color[S]);
while(!q.empty())
{
int now = q.front(); q.pop();
vis2[now] = 0;
for(int i = head2[now]; i != -1; i = e2[i].next)
{
if(dis[e2[i].to] > dis[now] + e2[i].len)
{
dis[e2[i].to] = dis[now] + e2[i].len;
if(!vis2[e2[i].to])
{
q.push(e2[i].to);
vis2[e2[i].to] = 1;
}
}
}
}
}
int main()
{
memset(head1, -1, sizeof(head1));
memset(head2, -1, sizeof(head2));
scanf("%d%d",&n,&m);
for(int i = 1; i <= m; i++)
{
scanf("%d%d",&x[i],&y[i]);
add1(x[i], y[i]);
}
for(int i = 1; i <= n; i++) scanf("%d",&val1[i]);
for(int i = 1; i <= n; i++)
if(!dfn[i]) tarjan(i);
for(int i = 1; i <= m; i++)
{
if(color[x[i]] != color[y[i]])
add2(color[x[i]], color[y[i]], val2[color[y[i]]]*(-1));
}
scanf("%d%d",&S,&p);
SPFA();
for(int i = 1; i <= p; i++)
{
scanf("%d",&end);
ans = max(ans, -1*dis[color[end]]);
}
//for(int i = 1; i <= n; i++) cout<<dis[i]<<" ";
printf("%d",ans);
return 0;
}

【luogu P3627 [APIO2009]抢掠计划】 题解的更多相关文章

  1. 洛谷 P3627 [APIO2009]抢掠计划 题解

    Analysis 建图+强连通分量+SPFA求最长路 但要保证最后到达的点中包含酒馆 虽然思路并不难想,但要求的代码能力很高. #include<iostream> #include< ...

  2. P3627 [APIO2009]抢掠计划

    P3627 [APIO2009]抢掠计划 Tarjan缩点+最短(最长)路 显然的缩点...... 在缩点时,顺便维护每个强连通分量的总权值 缩完点按照惯例建个新图 然后跑一遍spfa最长路,枚举每个 ...

  3. 【题解】洛谷P3627 [APIO2009]抢掠计划(缩点+SPFA)

    洛谷P3627:https://www.luogu.org/problemnew/show/P3627 思路 由于有强连通分量 所以我们可以想到先把整个图缩点 缩点完之后再建一次图 把点权改为边权 并 ...

  4. 洛谷 P3627 [APIO2009]抢掠计划 Tarjan缩点+Spfa求最长路

    题目地址:https://www.luogu.com.cn/problem/P3627 第一次寒假训练的结测题,思路本身不难,但对于我这个码力蒟蒻来说实现难度不小-考试时肛了将近两个半小时才刚肛出来. ...

  5. [洛谷P3627][APIO2009]抢掠计划

    题目大意:给你一张$n(n\leqslant5\times10^5)$个点$m(m\leqslant5\times10^5)$条边的有向图,有点权,给你起点和一些可能的终点.问从起点开始,到任意一个终 ...

  6. 洛谷 P3627 [APIO2009]抢掠计划

    这题一看就是缩点,但是缩完点怎么办呢?首先我们把所有的包含酒吧的缩点找出来,打上标记,然后建立一张新图, 每个缩点上的点权就是他所包含的所有点的点权和.但是建图的时候要注意,每一对缩点之间可能有多条边 ...

  7. Luogu 3627 [APIO2009]抢掠计划

    不爽. 为什么tarjan能爆栈啊 十分显然的缩点,给缩点之后的点连上权值为后一个点集权值的有向边,然后spfa跑最长路. 注意一开始$dis_{st}$应该等于$st$这个集合的权值. 时间复杂度$ ...

  8. 题解 P3627 【[APIO2009]抢掠计划】

    咕了四个小时整整一晚上 P3627 [APIO2009] 抢掠计划(https://www.luogu.org/problemnew/show/P3627) 不难看出答案即为该有向图的最长链长度(允许 ...

  9. APIO2009 抢掠计划 Tarjan DAG-DP

    APIO2009 抢掠计划 Tarjan spfa/DAG-DP 题面 一道\(Tarjan\)缩点水题.因为可以反复经过节点,所以把一个联通快中的所有路口看做一个整体,缩点后直接跑\(spfa\)或 ...

随机推荐

  1. Unable to connect to data source (DSN: shangjihuiclient; Network Address: ; Port Number: 53397). Cannot connect to TimesTen Server. Verify that the TimesTen Server is running or verify that your TCP PORT is set correctly.

    安装完毕TimesTen后,在客户端连接时一直报错. 解决办法是:重启服务器,在连接没在报这个错误.

  2. 个人笔记——Android网络技术

    一.WebView 的用法 Android 提供WebView 的用法,可以在自己的应用程序里嵌入一个浏览器 webView.getSettings().setJavaScriptEnabled(tr ...

  3. xsd表示byte[]的类型

    byte[]对应xs:base64Binary http://stackoverflow.com/questions/5912526/representing-byte-array-as-an-xsd ...

  4. Nginx图片服务器

    最近总项目因为需要显示图片,就使用了Nginx,使用很简单,下面简单介绍一下怎么用 压缩包下载地址,解压即用 http://files.cnblogs.com/files/sanduweiliangx ...

  5. 数据从mysql迁移到hbase的一些思考及设计

    一.进行迁移的原因 由于业务的发展,使用mysql进行建立索引进行搜索已经造成数据流的瓶颈卡在了数据库io,例如每次dump全表的时候,会造成压力过大,造成耗时很长,并且当前的数据量基本上已经达到了亿 ...

  6. UML建模—EA的使用起步

    Enterprise Architect(EA) 是一个功能比较强悍的建模工具. 对于一个软件设计者来说,从需求分析到业务设计.类模型设计.数据库设计到测试.发布.部署等一系列软件设计必须的操作都可以 ...

  7. SQL更新派工单数量=任务数量的

    select b.FCommitQty '任务数量',a.FQty '派工数量',a.FSourceBillNo '派工单号',b.FBillNo '任务单号',a.FStatus '派工状态' fr ...

  8. 迟到的UED(转发)

    2013UCAN用户体验设计论坛–精彩视频赏析 - 交互设计 博文 视觉设计 | TaoBaoUEDhttp://ued.taobao.org/blog/2013/09/2013ucan/

  9. 使用python简单创建一个用户和商城小程序

    整体思路: 1.用户功能:购买.显示余额.列表清单.输入 2.商家功能:修改和添加商品 创建两个接口: 用户: #Author: Gordon #读取文档,生成goodsf = open('goods ...

  10. Etcd入门教程

    etcd是一个类似于zk的工具,用于保存值,节点-值这种映射关系的.节点组织结构类似unix文件系统结构,从/最开始.比如一个/test/name节点,值为guanxianseng.可以通过etcdc ...