CF1137C Museums Tour
思路
强连通分量的好题
对于每个博物馆,因为时间的限制条件,不好直接统计,
发现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的更多相关文章
- CF1137C Museums Tour(Tarjan,强连通分量)
好题,神题. 题目链接:CF原网 洛谷 题目大意: 一个国家有 $n$ 个城市,$m$ 条有向道路组成.在这个国家一个星期有 $d$ 天,每个城市有一个博物馆. 有个旅行团在城市 $1$ 出发,当天是 ...
- CF1137C Museums Tour(tarjan+DP)
由于d很小,所以可以把每个点拆成d个点,然后对于边(x,y),连边时连接((x,i),(y,i+1))及((x,d),(y,1)).然后可以对这样连的边跑一遍tarjan缩点.然后直接暴力DP即可.不 ...
- CF 1138 E. Museums Tour
E. Museums Tour 链接 分析: 按时间建出分层图,每个点形如(u,t),表示u在在t个时刻的点,tarjan缩点.每个强连通分量中的点都能经过,然后DAG上dp. 代码: #includ ...
- CF1137 C. Museums Tour
CF1137 C. Museums Tour 一般来说的正常思路:看到有向图的第一思路都是缩点(但是要分析一波证明强联通分量中的个体可以拼凑成整体,一般都是边和点可以经过无数次然后贡献只算一次这种类型 ...
- 【CF1137C】 Museums Tour 拆点+缩点
https://codeforc.es/contest/1137/problem/C # 题意 给你n个点,每个点有k天博物馆开放时间的安排表. 有m条单向道路,走过一条边需要一个晚上,经过后就是第二 ...
- 【Codeforces 1137C】Museums Tour
Codeforces 1137 C 题意:给一个有向图,一周有\(d\)天,每一个点在每一周的某些时刻会开放,现在可以在这个图上从\(1\)号点开始随意地走,问最多能走到多少个开放的点.一个点如果重复 ...
- [CF1137]Museums Tour
link \(\text{Description:}\) 一个国家有 \(n\) 个城市,\(m\) 条有向道路组成.在这个国家一个星期有 \(d\) 天,每个城市有一个博物馆. 有个旅行团在城市 \ ...
- Codeforces 1137C Museums Tour (强连通分量, DP)
题意和思路看这篇博客就行了:https://www.cnblogs.com/cjyyb/p/10507937.html 有个问题需要注意:对于每个scc,只需要考虑进入这个scc的时间即可,其实和从哪 ...
- codeforces选做
收录了最近本人完成的一部分codeforces习题,不定期更新 codeforces 1132E Knapsack 注意到如果只使用某一种物品,那么这八种物品可以达到的最小相同重量为\(840\) 故 ...
随机推荐
- C++的类型转换
一.类型转换名称和语法 1.C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是: TYPE b = (TYPE)a 2.C++风格的类型转换提供了4种类型转换操作符来应对 ...
- Yii2 Restful api自定义资源
- hdu3037 lucas
题意 : 给了n课不同的树,要求将 0,1,2,3,4,5,...m个松果,分别放在n棵树上的方案数有多少, 我们这样考虑, 如果将m个相同的松果 放入n棵树中 , 转化一下,我们让每个点至少放1个 ...
- Sitecore营销自动化
增加与战略性自动化营销系统的互动 Sitecore营销自动化基于DMS中的Sitecore个性化功能.营销自动化系统使用诸如位置,设备和先前访问或购买之类的客户数据来影响用户沿着购买路径的旅程.这些系 ...
- sitecore系统教程之内容创作入门
在Sitecore中,有两种编辑工具,您可以在其中创建和编辑网站上的内容: 内容编辑器 - 专为熟悉Sitecore及其包含的功能的经验丰富的内容作者而设计的应用程序. 体验编辑器 - 一种直观的编辑 ...
- 列表选择模式:单选、按shift、按shift或ctrl
2018-10-29 21:23:16 开始写 import java.awt.BorderLayout; import java.awt.EventQueue; import javax.swing ...
- Explorer Bo (思维 + 树链剖分)
题意:求用最少的链覆盖所有的边用最少的总链长度. 思路:为了使得使用的链最少,我们可以知道使用的数量应该是(子叶 + 1)/ 2. 画图可知:当节点下的边数是偶数时,为了将该父节点上的边给连接上,所以 ...
- 关于treeMap
https://www.cnblogs.com/skywang12345/p/3310928.html
- The Little Prince-11/27
The Little Prince-11/27 The little boy gradually realized that it is tiresome for children to be ...
- maven项目启动报错;class path resource [com/ssm/mapping/] cannot be resolved to URL because it does not exist
项目启动报了一堆错误,其实都是class path resource [com/ssm/mapping/] cannot be resolved to URL because it does not ...