思路:如果出现了一个强连通分量,那么走到这个点时一定会在强连通分量里的点全部走一遍,这样才能更大。所以我们首先用Tarjan跑一遍求出所有强连通分量,然后将强连通分量缩成点(用到栈)然后就变成了一个DAG(有向无环图),然后跑一遍DFS,不断加上遍历点的权值,如果到了网吧,则更新一遍答案,因为可以出去了。

求强连通分量时,如果low[u] == dfn[u],说明形成了一个新的强连通分量,且根为u。具体求强连通分量见:http://www.cnblogs.com/whatbeg/p/3776422.html

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <stack>
using namespace std;
#define N 100007 struct Edge
{
int v,next;
}G[*N],G2[*N]; int first[*N],first2[*N],low[N],dfn[N];
int instk[N],bel[N],coin[N],iswb[N],wb[N],coin2[N];
int tot,tot2,n,m,Time,cnt,P,K,res;
stack<int> stk; void addedge(Edge *G,int& tot,int *first,int u,int v)
{
G[tot].v = v;
G[tot].next = first[u];
first[u] = tot++;
} void Tarjan(int u)
{
low[u] = dfn[u] = ++Time;
stk.push(u);
instk[u] = ;
for(int i=first[u];i!=-;i=G[i].next)
{
int v = G[i].v;
if(!dfn[v]) //树边
{
Tarjan(v);
low[u] = min(low[u],low[v]);
}
else if(instk[v]) //回边
low[u] = min(low[u],dfn[v]);
}
if(low[u] == dfn[u])
{
cnt++;
int v;
do
{
v = stk.top();
stk.pop();
if(iswb[v])
wb[cnt] = ;
instk[v] = ;
coin2[cnt] += coin[v];
bel[v] = cnt;
if(v == P)
P = cnt;
}while(u != v);
}
} void dfs(int u,int sum)
{
sum += coin2[u];
if(wb[u])
res = max(res,sum);
for(int i=first2[u];i!=-;i=G2[i].next)
{
int v = G2[i].v;
dfs(v,sum);
}
} int main()
{
int i,j,u,v;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(first,-,sizeof(first));
memset(first2,-,sizeof(first2));
memset(G,,sizeof(G));
memset(G2,,sizeof(G2));
memset(iswb,,sizeof(iswb));
memset(wb,,sizeof(wb));
memset(instk,,sizeof(instk));
memset(bel,-,sizeof(bel));
memset(coin2,,sizeof(coin2));
memset(low,,sizeof(low));
memset(dfn,,sizeof(dfn));
tot = tot2 = ;
Time = cnt = ;
while(!stk.empty())
stk.pop();
for(i=;i<m;i++)
{
scanf("%d%d",&u,&v);
addedge(G,tot,first,u,v);
}
for(i=;i<=n;i++)
scanf("%d",&coin[i]);
scanf("%d",&P);
scanf("%d",&K);
for(i=;i<K;i++)
{
scanf("%d",&v);
iswb[v] = ;
}
for(v=;v<=n;v++) //Tarjan求强连通分量
{
if(!dfn[v])
Tarjan(v);
}
for(i=;i<=n;i++) //重建为一个DAG
{
for(j=first[i];j!=-;j=G[j].next)
{
v = bel[G[j].v];
u = bel[i];
if(u != v) //如果相连点不是一个连通分量
addedge(G2,tot2,first2,u,v); //建桥
}
}
res = -;
dfs(P,);
printf("%d\n",res);
}
return ;
}

UESTC 901 方老师抢银行 --Tarjan求强连通分量的更多相关文章

  1. UESTC 898 方老师和缘分 --二分图匹配+强连通分量

    这题原来以为是某种匹配问题,后来好像说是强连通的问题. 做法:建图,每个方老师和它想要的缘分之间连一条有向边,然后,在给出的初始匹配中反向建边,即如果第i个方老师现在找到的是缘分u,则建边u-> ...

  2. tarjan求强连通分量+缩点+割点以及一些证明

    “tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄>   自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...

  3. Tarjan求强连通分量,缩点,割点

    Tarjan算法是由美国著名计算机专家发明的,其主要特点就是可以求强连通分量和缩点·割点. 而强联通分量便是在一个图中如果有一个子图,且这个子图中所有的点都可以相互到达,这个子图便是一个强连通分量,并 ...

  4. tarjan求强连通分量+缩点+割点/割桥(点双/边双)以及一些证明

    “tarjan陪伴强联通分量 生成树完成后思路才闪光 欧拉跑过的七桥古塘 让你 心驰神往”----<膜你抄>   自从听完这首歌,我就对tarjan开始心驰神往了,不过由于之前水平不足,一 ...

  5. HDU 1827 Summer Holiday(tarjan求强连通分量+缩点构成新图+统计入度+一点贪心思)经典缩点入门题

    Summer Holiday Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  6. CCF 高速公路 tarjan求强连通分量

    问题描述 某国有n个城市,为了使得城市间的交通更便利,该国国王打算在城市之间修一些高速公路,由于经费限制,国王打算第一阶段先在部分城市之间修一些单向的高速公路. 现在,大臣们帮国王拟了一个修高速公路的 ...

  7. UVALive 4262——Trip Planning——————【Tarjan 求强连通分量个数】

    Road Networks Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Stat ...

  8. tarjan求强连通分量(模板)

    https://www.luogu.org/problem/P2341 #include<cstdio> #include<cstring> #include<algor ...

  9. Tarjan求强连通分量、求桥和割点模板

    Tarjan 求强连通分量模板.参考博客 #include<stdio.h> #include<stack> #include<algorithm> using n ...

随机推荐

  1. Android Xutils 框架(转)

    Android Xutils 框架 (转) 目录(?)[-] xUtils简介 目前xUtils主要有四大模块 使用xUtils快速开发框架需要有以下权限 混淆时注意事项 DbUtils使用方法 Vi ...

  2. JavaScript基础13——js的string对象

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. JavaScript基础12——js的方法重载

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  4. Vue列表渲染

    gitHub地址:https://github.com/lily1010/vue_learn/tree/master/lesson09 一 for循环数组 <!DOCTYPE html> ...

  5. javascript --- 子对象访问父对象的方式

    在传统面向对象的编程语言里,都会提供一种子类访问父类的特殊语法,引文我们在实现子类方法往往需要父类方法的额外辅助.在这种情况下,子类通常会调用父类中的同名方法,最终以便完成工作. javascript ...

  6. 转:纠结的Shim

    原文地址:http://www.haorooms.com/post/requirejs_sy_lj RequireJs已经流行很久了,它提供了以下功能: 声明不同js文件之间的依赖 可以按需.并行.延 ...

  7. 读书笔记2014第6本:《The Hunger Games》

    以前从未读过一本完整的英文小说,所有就在今年的读书目标中增加了一本英文小说,但在头四个月内一直没有下定决定读哪一本.一次偶然从SUN的QQ空间中看到Mockingjay,说是不错的英文小说,好像已经是 ...

  8. NSString的八条实用技巧

    NSString的八条实用技巧 有一篇文章写了:iOS开发之NSString的几条实用技巧 , 今天这篇,我们讲讲NSString的八条实用技巧.大家可以收藏起来,方便开发随时可以复制粘贴. 0.首字 ...

  9. CoreAnimation-09-模拟时钟

    效果图 实现思路 该示例通过隐式动画实现 表盘通过显示在imageView中的一张图片来实现 在表盘上绘制(时分秒)三条直线,分别位于不同的图层,且时针位于最下层,秒针位于最上层 设置直线为圆角 直线 ...

  10. ASP.NET @Page指令属性(vs2010)

    最近看一篇好文章,摘抄下来. 原文出处:http://www.cnblogs.com/zhaozhan/archive/2010/05/01/1725819.html @Page指令位于每个ASP.N ...