这题一看就是缩点,但是缩完点怎么办呢?首先我们把所有的包含酒吧的缩点找出来,打上标记,然后建立一张新图,

每个缩点上的点权就是他所包含的所有点的点权和。但是建图的时候要注意,每一对缩点之间可能有多条边,所以我们可以先把重边去除一下,在建立新图,具体操作如下:

1 for(int i=1;i<=n;i++)
 2     {
 3         if(vis[i]==0) continue;
 4         for(int j=last[i];j;j=g[j].next)
 5         {
 6             int v=g[j].to;
 7             if(g[i].co!=g[v].co&&vis[v]==1)
 8             {
 9                 e[++cnt].a=g[i].co;
10                 e[cnt].b=g[v].co;
11             }
12         }
13     }
14     sort(e+1,e+cnt+1,cmp);
15     for(int i=1;i<=cnt;i++)
16     {
17         if(e[i].a!=e[i-1].a||e[i].b!=e[i-1].b)
18         {
19             add1(e[i].a,e[i].b);
20         }                
21     }

具体思路就是先枚举所有点和所有边,如果两个点不属于同一个强联通分量,那么就用e来把边存一下,然后对e进行排序

,去重,再建图。

建完图之后就好办了,可以跑spfa单源最长路,也可以dp,因为最后一定会终止在酒吧,所以就取所有打过标记的节点的最大值就好了。

最后附上代码:

1 #include<iostream>
  2 #include<cmath>
  3 #include<cstdio>
  4 #include<string>
  5 #include<cstring>
  6 #include<algorithm>
  7 #define maxn 500005
  8 using namespace std;
  9 struct edge
 10 {
 11     int next;
 12     int to;
 13     int co;
 14 }g[maxn];
 15 
 16 struct edge1
 17 {
 18     int next;
 19     int to;
 20 }g1[maxn];
 21 struct edhe
 22 {
 23     int a,b;
 24 }e[maxn];
 25 
 26 
 27 inline int read()
 28 {
 29     char c=getchar();
 30     int res=0,x=1;
 31     while(c<'0'||c>'9')
 32     {
 33         if(c=='-')
 34         x=-1;
 35         c=getchar();
 36     }
 37     while(c>='0'&&c<='9')
 38     {
 39         res=res*10+(c-'0');
 40         c=getchar();
 41     }
 42     return x*res;
 43 }
 44 
 45 int n,m,aa,bb,num,s,p,tot,top,col,num1,ans,ae,cnt;
 46 int last[maxn],a[maxn],b[maxn],dfn[maxn],st[maxn],low[maxn];
 47 int shu[maxn],d[maxn],last1[maxn],sum[maxn],vis[maxn];
 48 
 49 inline void add(int from,int to)
 50 {
 51     g[++num].next=last[from];
 52     g[num].to=to;
 53     last[from]=num;
 54 }
 55 
 56 inline void add1(int from,int to)
 57 {
 58     g1[++num1].next=last1[from];
 59     g1[num1].to=to;
 60     last1[from]=num1;
 61 }
 62 
 63 inline void tarjan(int u)
 64 {
 65     low[u]=dfn[u]=++tot;
 66     st[++top]=u;
 67     for(int i=last[u];i;i=g[i].next)
 68     {
 69         int v=g[i].to;
 70         if(!dfn[v])
 71         {
 72             tarjan(v);
 73             if(low[v]<low[u])
 74             low[u]=low[v];
 75         }
 76         else if(!g[v].co)
 77         {
 78             if(dfn[v]<low[u])
 79             low[u]=dfn[v];
 80         }
 81     }
 82     if(low[u]==dfn[u])
 83     {
 84         g[u].co=++col;
 85         while(st[top]!=u)
 86         {
 87             g[st[top]].co=col;
 88             top--;
 89         }
 90         top--;
 91     }
 92 }
 93 
 94 void dfs(int x)
 95 {
 96     for(int i=last1[x];i;i=g1[i].next)
 97     {
 98         int v=g1[i].to;
 99         if(sum[x]+shu[v]>sum[v])
100         {
101             sum[v]=sum[x]+shu[v];
102             dfs(v);
103         }
104     }
105 }
106 
107 bool cmp(edhe a,edhe b)
108 {
109     if(a.a==b.a)
110     {
111         return a.b<b.b;
112     }
113     else return a.a<b.a;
114 }
115 
116 int main()
117 {
118     n=read();
119     m=read();
120     for(int i=1;i<=m;i++)
121     {
122         aa=read();bb=read();
123         add(aa,bb);
124     }
125     for(int i=1;i<=n;i++)
126     {
127         a[i]=read();
128     }
129     s=read();p=read();
130     for(int i=1;i<=p;i++)
131     {
132         aa=read();
133         b[aa]=1;
134     }
135     for(int i=1;i<=n;i++)
136     {
137         if(!dfn[i])
138         tarjan(i);
139     }
140     for(int i=1;i<=n;i++)
141     {
142         shu[g[i].co]+=a[i];
143         if(b[i]==1)
144         {
145             d[g[i].co]=1;
146         }
147     }
148     for(int i=1;i<=n;i++)
149     {
150         if(vis[i]==0) continue;
151         for(int j=last[i];j;j=g[j].next)
152         {
153             int v=g[j].to;
154             if(g[i].co!=g[v].co)
155             {
156                 e[++cnt].a=g[i].co;
157                 e[cnt].b=g[v].co;
158             }
159         }
160     }
161     sort(e+1,e+cnt+1,cmp);
162     for(int i=1;i<=cnt;i++)
163     {
164         if(e[i].a!=e[i-1].a||e[i].b!=e[i-1].b)
165         {
166             add1(e[i].a,e[i].b);
167         }                
168     }
169     sum[g[s].co]=shu[g[s].co];
170     dfs(g[s].co);
171     for(int i=1;i<=col;i++)
172     {
173         if(d[i]==1)
174         {
175             if(ans<sum[i])
176             ans=sum[i];
177         }
178     }
179     printf("%d",ans);
180     return 0;
181 }

洛谷 P3627 [APIO2009]抢掠计划相关推荐

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

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

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

    题目链接:https://www.luogu.org/problemnew/show/P3627 把点权转化到边权上去. #include <stack> #include <que ...

  3. 【洛谷】P1137旅行计划

    [洛谷]P1137旅行计划 题目描述 小明要去一个国家旅游.这个国家有N个城市,编号为1至N,并且有M条道路连接着,小明准备从其中一个城市出发,并只往东走到城市i停止. 所以他就需要选择最先到达的城市 ...

  4. 洛谷千题复习计划(一)(Codeforces + AtCoder)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 每天花一个小时简单复习一下我写过的洛谷的题目! 虽然还没有到千题,但是快了(等我复习完这些以后我 lu ...

  5. 我的洛谷冬日绘板计划

    我为什么要画这个? 首先,这是一只金色的企鹅--不是鸭子啦! 金企鹅(JQE)是我的一个学长,从我走上oi这条路开始,他就一直在给予我极大的帮助. 可是oi的美好时光流逝得太快,现在他已经高三了,成为 ...

  6. 外卖(food) 洛谷4040宅男计划 三分套二分贪心

    food评测传送门 [题目描述] 叫外卖是一个技术活,宅男宅女们一直面对着一个很大的矛盾,如何以有限的金钱在宿舍宅得尽量久.     外卖店一共有 N 种食物,每种食物有固定的价钱 Pi 与保质期 S ...

  7. 洛谷 P2762 太空飞行计划问题

    题目背景 题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,-,Em},和进行这些实验需要使用的 ...

  8. [APIO2009]抢掠计划

    题目描述 Siruseri 城中的道路都是单向的.不同的道路由路口连接.按照法律的规定, 在每个路口都设立了一个 Siruseri 银行的 ATM 取款机.令人奇怪的是,Siruseri 的酒吧也都设 ...

  9. 洛谷 P2762 太空飞行计划问题(自己理解的口胡版)

    题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,-,Em},和进行这些实验需要使用的全部仪器的 ...

最新文章

  1. java实现线程同步的方法_Java实现线程同步方法及原理详解
  2. 炫彩界面库使用方法问题记录
  3. 适合vue的富文本框
  4. 最全 | Redis可视化工具横向评测
  5. Algorithm:C+语言实现之数组相关算法(和为定值的两个数、和为定值的m个数、荷兰国旗、长度为2n的洗牌算法、任意长度数组的洗牌算法)
  6. ConcurrentHashMap的源码分析-fullAddCount源码分析
  7. ABP vNext微服务架构详细教程——分布式权限框架(上)
  8. ActiveReports 报表控件V12新特性 -- 新增JSON和CSV导出
  9. 关于云开发新服务“实时数据推送”,你需要了解的全在这了!
  10. HDU——2768 Cat vs. Dog
  11. C++引用和指针区别
  12. CSS Box Model 盒子模型
  13. hadoop本机运行 解决winutils.exe的问题
  14. Github爆款!Aura v2.0.0正式版来了…
  15. 小心!新媒体环境下,营销传播还有几个大坑!
  16. javascript的apply理解
  17. 谷歌大脑组合模型霸榜 SuperGLUE,什么模型这么高?
  18. 月租最便宜的手机卡_月租最高不超过10元!最适合当副卡的手机卡套餐全在这了...
  19. 机器学习中的数学基础--随机变量与概率分布,伯努利分布和泊松分布,贝叶斯定理
  20. Java基础 DAY01

热门文章

  1. 【调试笔记】韦东山:在100ask_imx6ull上移植使用六轴传感器ICM20608
  2. SiamFC代码大乱炖 (pytorch)
  3. 小米温湿度传感器协议分析
  4. 高校网上跳蚤市场设计与实现(SSM)
  5. 万众期待的Adobe Photoshop 2021 for Mac正式上线
  6. moviepy音视频剪辑:使用VideoFileClip、AudioFileClip和write_videofile、write_audiofile进行音视频的加载和输出
  7. 微信课程表小程序(0基础教你用,从入门到发布)
  8. ROSEMOUNT变送器选型指导
  9. 影响差压变送器性能的五大要素
  10. VueUse中的这5个函数,也太好用了吧