题目链接: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. 线程同步(windows平台):互斥对象

    一:介绍 互斥对象是系统内核维护的一种数据结构,保证了对象对单个线程的访问权. 二:函数说明 创建互斥对象:    HANDLE CreateMutex(            LPSECURITY_ ...

  2. lua实现List及Dictionary

    转载:http://www.maosongliang.com/archives/122 参考 http://blog.csdn.net/jason_520/article/details/541736 ...

  3. 生成正射影像/DSM,等高线提取

    工具:ContextCapture,Globe Mapper 方法/步骤: 1.新建项目,导入影像,提交空三运算 在ContextCapture中新建项目,添加相关影像或视频和其他相关资源,资源,提交 ...

  4. 细说C#中的序列化与反序列化的基本原理和过程

    虽然我们平时都使用第三方库来进行序列化和反序列化,用起来也很方便,但至少得明白序列化与反序列化的基本原理. 懂得人就别看了! 注意:从.NET Framework 2.0 开始,序列化格式化器类Soa ...

  5. WCF入门教程通信(二)

    一.概述 WCF能够建立一个跨平台的安全.可信赖.事务性的解决方案,是一个WebService,.Net Remoting,Enterprise Service,WSE,MSMQ的并集,有一副很经典的 ...

  6. ASP.NET MVC 生命周期

    本文的目的旨在详细描述ASP.NET MVC请求从开始到结束的每一个过程.我希望能理解在浏览器输入URL并敲击回车来请求一个ASP.NET MVC网站的页面之后发生的任何事情. 为什么需要关心这些?有 ...

  7. LintCode刷题小记491

    题目: 判断一个正整数是不是回文数. 回文数的定义是,将这个数反转之后,得到的数仍然是同一个数. 样例: 11, 121, 1, 12321 这些是回文数. 23, 32, 1232 这些不是回文数. ...

  8. C#-01.语法基础

    a. 语法基础 i. 命名空间(namespace):是 C# 中组织代码的方式,用来声明命名空间 . 语法:namespace 命名空间名称{ //命名空间的声明 } . 作用:可以把紧密相关的一些 ...

  9. Mysql数据库死锁分析相关概念

    参考博客: mysql死锁问题分析(https://www.cnblogs.com/LBSer/p/5183300.html) mysql insert锁机制(http://yeshaoting.cn ...

  10. Supper关键字

    java中的super关键字是一个引用变量,用于引用直接父类对象. 每当创建子类的实例时,父类的实例被隐式创建,由super关键字引用变量引用. java super关键字的用法如下: super可以 ...