思路

强连通分量的好题

对于每个博物馆,因为时间的限制条件,不好直接统计,

发现d很小,可以建出d层分层图,原图<u,v>的边变成<u,i>到<v,i+1>的边,<u,n>变成<v,1>的边,然后跑SCC,拆出每个点权值就是这个点这个时间有无贡献,此时一个强连通分量全选就能获得最大的价值了,然后注意同一个i只会出现在一个SCC中且只能被统计一次,所以要去下重

代码

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <stack>
#include <set>
#include <bitset>
using namespace std;
int cnt,v[5000100],fir[5000100],nxt[5000100],dfn[5000100],dfs_clock,low[5000100],sccno[5000100],vis[5000100],scccnt,sccnum[5000100],d,n,m;
set<int> scc_S[5000100];
stack<int> S;
bitset<100100> mat[51];
inline void addedge(int ui,int vi){
// printf("add:%d -> %d\n",ui,vi);
++cnt;
v[cnt]=vi;
nxt[cnt]=fir[ui];
fir[ui]=cnt;
}
int cnt2,v2[5000100],fir2[5000100],nxt2[5000100];
inline void addedge2(int ui,int vi){
// printf("add2:%d -> %d\n",ui,vi);
++cnt2;
v2[cnt2]=vi;
nxt2[cnt2]=fir2[ui];
fir2[ui]=cnt2;
}
inline void tarjan(int u){
dfn[u]=low[u]=++dfs_clock;
vis[u]=true;
S.push(u);
for(int i=fir[u];i;i=nxt[i]){
if(!dfn[v[i]]){
tarjan(v[i]);
low[u]=min(low[u],low[v[i]]);
}
else if(vis[v[i]]){
low[u]=min(low[u],low[v[i]]);
}
}
if(low[u]==dfn[u]){
++scccnt;
while(1){
int x=S.top();
S.pop();
vis[x]=false;
sccno[x]=scccnt;
if(x==u)
break;
}
}
}
inline void sd(void){
for(int i=1;i<=d*n;i++)
if(!dfn[i])
tarjan(i);
for(int i=1;i<=d;i++)
for(int j=1;j<=n;j++){
if(mat[i][j])
scc_S[sccno[j+(i-1)*n]].insert(j);
for(int k=fir[j+(i-1)*n];k;k=nxt[k])
if(sccno[j+(i-1)*n]!=sccno[v[k]])
addedge2(sccno[j+(i-1)*n],sccno[v[k]]);
}
for(int i=1;i<=scccnt;i++)
sccnum[i]=scc_S[i].size();
}
int dp[5000100];
bitset<5000100> visx;
inline int dfs(int o){
// printf("u=%d\n",o);
if(visx[o])
return dp[o];
visx[o]=true;
for(int i=fir2[o];i;i=nxt2[i]){
dp[o]=max(dfs(v2[i]),dp[o]);
}
dp[o]+=sccnum[o];
return dp[o];
}
int main(){
scanf("%d %d %d",&n,&m,&d);
for(int i=1;i<=m;i++){
int a,b;
scanf("%d %d",&a,&b);
for(int j=1;j<d;j++)
addedge(a+(j-1)*n,b+j*n);
addedge(a+(d-1)*n,b);
}
for(int i=1;i<=n;i++)
for(int j=1;j<=d;j++){
char c=getchar();
while(c!='0'&&c!='1'){
c=getchar();
}
mat[j][i]=c-'0';
}
sd();
// for(int i=1;i<=n*d;i++)
// printf("sccno[%d]=%d\n",i,sccno[i]);
// for(int i=1;i<=scccnt;i++)
// printf("sccnum[%d]=%d\n",i,sccnum[i]);
printf("%d\n",dfs(sccno[1]));
return 0;
}

CF1137C Museums Tour的更多相关文章

  1. CF1137C Museums Tour(Tarjan,强连通分量)

    好题,神题. 题目链接:CF原网 洛谷 题目大意: 一个国家有 $n$ 个城市,$m$ 条有向道路组成.在这个国家一个星期有 $d$ 天,每个城市有一个博物馆. 有个旅行团在城市 $1$ 出发,当天是 ...

  2. CF1137C Museums Tour(tarjan+DP)

    由于d很小,所以可以把每个点拆成d个点,然后对于边(x,y),连边时连接((x,i),(y,i+1))及((x,d),(y,1)).然后可以对这样连的边跑一遍tarjan缩点.然后直接暴力DP即可.不 ...

  3. CF 1138 E. Museums Tour

    E. Museums Tour 链接 分析: 按时间建出分层图,每个点形如(u,t),表示u在在t个时刻的点,tarjan缩点.每个强连通分量中的点都能经过,然后DAG上dp. 代码: #includ ...

  4. CF1137 C. Museums Tour

    CF1137 C. Museums Tour 一般来说的正常思路:看到有向图的第一思路都是缩点(但是要分析一波证明强联通分量中的个体可以拼凑成整体,一般都是边和点可以经过无数次然后贡献只算一次这种类型 ...

  5. 【CF1137C】 Museums Tour 拆点+缩点

    https://codeforc.es/contest/1137/problem/C # 题意 给你n个点,每个点有k天博物馆开放时间的安排表. 有m条单向道路,走过一条边需要一个晚上,经过后就是第二 ...

  6. 【Codeforces 1137C】Museums Tour

    Codeforces 1137 C 题意:给一个有向图,一周有\(d\)天,每一个点在每一周的某些时刻会开放,现在可以在这个图上从\(1\)号点开始随意地走,问最多能走到多少个开放的点.一个点如果重复 ...

  7. [CF1137]Museums Tour

    link \(\text{Description:}\) 一个国家有 \(n\) 个城市,\(m\) 条有向道路组成.在这个国家一个星期有 \(d\) 天,每个城市有一个博物馆. 有个旅行团在城市 \ ...

  8. Codeforces 1137C Museums Tour (强连通分量, DP)

    题意和思路看这篇博客就行了:https://www.cnblogs.com/cjyyb/p/10507937.html 有个问题需要注意:对于每个scc,只需要考虑进入这个scc的时间即可,其实和从哪 ...

  9. codeforces选做

    收录了最近本人完成的一部分codeforces习题,不定期更新 codeforces 1132E Knapsack 注意到如果只使用某一种物品,那么这八种物品可以达到的最小相同重量为\(840\) 故 ...

随机推荐

  1. Day8 面向对象

    一.面向对象和面向过程 各位,我们现在如果要将大象放冰箱,用面向过程怎么实现呢? 1.把大象放到冰箱里 第一步:把冰箱门打开 第二步:把大象放进去 第三步:把门关上 def open_fridge_d ...

  2. 回声状态网络(ESN)基础教程

    http://jlearning.cn/2017/05/29/ESN-basic-tutorial/ 最近在看回声状态网络(Echo State Network)的内容,注意到中文搜索引擎搜不到关于有 ...

  3. MVC中修改Table值

    记录下: 遇到这样一个问题,表中有一个Char栏位,为1/0 ,只是在视图界面 让其显示为 开始/结束, 目前想到的两种解决办法: ①后台写查询的SQL时,直接写 SELECT a.Status, ( ...

  4. sql server 中后缀为.mdf的文件是干什么用的??

    在微软的SQL Server 2000 数据库有三种类型的文件: 1)主要数据文件(扩展名.mdf是 primary data file 的缩写) 主要数据文件包含数据库的启动信息,并指向数据库中的其 ...

  5. Windows以及Linux系统文件、文件夹命名规则

    在实际开发中又是会碰到"文件名.目录名或卷标语法不正确."这样的错误信息,基本就是由于文件命名出现问题. 在Windows下: 1.文件名或文件夹名可以由1-256个西文字符或12 ...

  6. php 获取ip地址的5种方法,插入用户登录日志实例

    php 获取ip地址的5种方法,插入用户登录日志实例,推荐使用第二种方法 <?php //方法1: $ip = $_SERVER["REMOTE_ADDR"]; echo $ ...

  7. 人工智能深度学习框架MXNet实战:深度神经网络的交通标志识别训练

    人工智能深度学习框架MXNet实战:深度神经网络的交通标志识别训练 MXNet 是一个轻量级.可移植.灵活的分布式深度学习框架,2017 年 1 月 23 日,该项目进入 Apache 基金会,成为 ...

  8. Python词云分析

    import jieba from matplotlib import pyplot as plt from wordcloud import WordCloud from PIL import Im ...

  9. jquery遍历获取每一行数据进行对比

    $("#dtlTable tr:gt(0)").each(function(i){ var orderQtyBy = $("input[name='orderQtyBys ...

  10. 有登陆认证的情况下如何使用Wisdom RESTClient?

    访问REST API时,很多系统需要登陆认证,登陆成功以后才允许访问API.下面介绍一下有登陆认证情况下如何使用 Wisdom RESTClient测试API的方法. 方法很简单即在浏览器上成功登录系 ...