洛谷 P3627 [APIO2009]抢掠计划
创始人
2024-03-18 13:39:06
0

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

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

 

 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
  2 #include
  3 #include
  4 #include
  5 #include
  6 #include
  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]  74             low[u]=low[v];
 75         }
 76         else if(!g[v].co)
 77         {
 78             if(dfn[v]  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 112     }
113     else return a.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 176             ans=sum[i];
177         }
178     }
179     printf("%d",ans);
180     return 0;
181 }

相关内容

热门资讯

你的晚安是我的早安是什么歌曲 你的晚安是我的早安是什么歌曲苏天伦《你的早安是我的晚安》“你的晚安是我的早安”是单小源的歌曲《东京遇...
积极进取的小故事 积极进取的小故事现代的普通人,不要名人的。不能与别人重复,尽快回答   啄木鸟的故事       啄...
熊出没之探险日记3什么时候播出... 熊出没之探险日记3什么时候播出?熊出没之探险日记3,春节前播放。熊出没只是探险日记三2020年5月4...
谁知道所有有关“七”的歌?拜托... 谁知道所有有关“七”的歌?拜托了各位 谢谢就是歌曲名里有“七”这个字的!谢谢七月七迅谈日晴 看我七十...
求一本小说 女主穿越了三次 每... 求一本小说 女主穿越了三次 每次都在福临身边 后来怀孕了孩子被打掉了那个 女主叫什么雯?那个女主就是...
如果记忆不说话,流年也会开出花... 如果记忆不说话,流年也会开出花的基本信息书 名:《如果记忆不弯饥好说话,流年也会开出花》埋铅 作 者...
你好,旧时光漫画版在哪里可以看... 你好,旧时光漫画版在哪里可以看?暂时在绘心上连载
一首英文歌,男的组合唱的,MV... 一首英文歌,男的组合唱的,MV是一个婚礼的过程。求歌名。是不是darin的can'tstoplove...
为什么很多人喜欢用胶片相机? 为什么很多人喜欢用胶片相机?有一种情怀叫做“怀旧“吧,现在数码相机越来越普遍了,已经到了”全民摄影“...
女主先爱上男主,男主却不喜欢女... 女主先爱上男主,男主却不喜欢女主或者是另有所爱,最后女主男主还是在一起的穿越小说。有木有再生缘:我的...
爱情失恋伤感句子 爱情失恋伤感句子越是美好的从前,越幸福的曾经,现在只能带来锥心的疼痛,痛到撕心裂肺,肝肠寸断,终于痛...
24岁穿这个会不会显老 24岁穿这个会不会显老有点显老,这个颜色款式,颜色有点暗,没有活力,属于那种气质佳,长得高雅的女人,...
哈尔的移动城堡英语版 哈尔的移动城堡英语版可以发给我吗度盘~请查收~
秦时明月之万里长城什么时候播 秦时明月之万里长城什么时候播据说是今年暑假开播别急,官网什么的信他你就输了,12年之前底应该会出,杭...
孩子会得抽动症吗? 孩子会得抽动症吗?我天生的气性比较大,有时跟别人斗嘴时候就会手脚哆嗦,麻木,我问一下这是不是抽动症就...
亨德尔一生为音乐献出了怎样的贡... 亨德尔一生为音乐献出了怎样的贡献?亨德尔一生写了歌剧41部,清唱剧21部,以及大量的管乐器与弦乐器的...
礼仪起源和发展的经典故事? 礼仪起源和发展的经典故事?一、礼仪的起源;1、天神生礼仪;2、礼为天地人的统一体;3、礼产生于人的自...
描写桂林山水的句子有哪些? 描写桂林山水的句子有哪些?天下风光数桂林有杨万里的“梅花五岭八桂林,青罗带绕碧玉簪”;有邹应龙的“无...
避免与强敌正面对决的成语 避免与强敌正面对决的成语避免与强敌正面对决的成语避实就虚 【近义】避重就轻、避难就易、声东击西【反义...
多愁善感类的成语 多愁善感类的成语心细如发【解释】:极言小心谨慎,考虑周密。亦作“心细于发”。【出自】:吴梅《题天香石...