思路

强连通分量的好题

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

发现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. Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现

    https://blog.csdn.net/zouxy09/article/details/9993371 自己平时看了一些论文,但老感觉看完过后就会慢慢的淡忘,某一天重新拾起来的时候又好像没有看过一 ...

  2. codeforces 957 C Three-level Laser

    题意: 说的是一个电子云的三种状态,但是这不重要. 简单来说,就是在一个升序的序列中找三个数x,y,z,x和z的值之差不超过u,然后使得(z – y) / (z – x)最大. 思路: 使得(z – ...

  3. Python大神成长之路: 第二次学习记录

    数据类型          数据操作 bytes 类型 "".encode() 编码-->二进制 "".decode() 解码 判断字符串里的字符是否全为 ...

  4. 【Hbase学习之五】HBase MapReduce

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-2.6.5 hbase-0.98.12.1-h ...

  5. STL容器之vector

    [1]模板类vector 模板类vector可理解为广义数组.广义数组,即与类型无关的数组,具有与数组相同的所有操作. 那么,你或许要问:既然C++语言本身已提供了一个序列式容器array,为什么还要 ...

  6. Runtime单例模式类 -- 控制电脑关机

    package demo1; import java.io.IOException; public class RunTimeDemo { public static void main(String ...

  7. highchart应用示例2-上:圆角柱状图,下:多指标曲线图

    1.ajax调用接口获取数据 function getCityData() { var date1 = $('#datetimepicker1').val(); var date2 = $('#dat ...

  8. 使用Fiddler测试WebApi接口

    Fiddler是好用的WebApi调试工具之一,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据,Fiddler 是以代理web服务器的形式工作的,使用 ...

  9. <转>jmeter(十)参数化

    本博客转载自:http://www.cnblogs.com/imyalost/category/846346.html 个人感觉不错,对jmeter讲解非常详细,担心以后找不到了,所以转发出来,留着慢 ...

  10. win10 +python3.6环境下安装opencv以及pycharm导入cv2有问题的解决办法

    一.安装opencv 借鉴的这篇博客已经写得很清楚了--------https://blog.csdn.net/u011321546/article/details/79499598       ,这 ...