bzoj 1924 [Sdoi2010]所驼门王的宝藏(构图,SCC,DP)
Description
Input
第一行给出三个正整数 N, R, C。 以下 N 行,每行给出一扇传送门的信息,包含三个正整数xi, yi, Ti,表示该传送门设在位于第 xi行第yi列的藏宝宫室,类型为 Ti。Ti是一个1~3间的整数, 1表示可以传送到第 xi行任意一列的“横天门”,2表示可以传送到任意一行第 yi列的“纵寰门”,3表示可以传送到周围 8格宫室的“ziyoumen”。 保证 1≤xi≤R,1≤yi≤C,所有的传送门位置互不相同。
Output
只有一个正整数,表示你确定的路线所经过不同藏宝宫室的最大数目。
Sample Input
2 2 1
2 4 2
1 7 2
2 7 3
4 2 2
4 4 1
6 7 3
7 7 1
7 5 2
5 2 1
Sample Output
【思路】
构图,SCC,DP
因为只有宝藏室有门所以传送到空房间是没有意义的,这样可以将n个宝藏室构图。
求出SCC,对于一个SCC内的任意节点可以互相到达而到达次数没有限制,所以缩点,将点权设为SCC的结点数,这样问题就变成了求DAG上的一条最大点权路,可以用DP求解。
需要注意的是DAG不一定连通。
【代码】
- #include<set>
- #include<stack>
- #include<vector>
- #include<cstdio>
- #include<cstring>
- #include<iostream>
- #include<algorithm>
- #define FOR(a,b,c) for(int a=(b);a<=(c);a++)
- using namespace std;
- const int N = *1e5+;
- struct Node{
- int x,y,id;
- bool operator < (const Node& rhs) const{
- return x<rhs.x || (x==rhs.x&&y<rhs.y);
- }
- };
- void read(int& x) {
- char c=getchar(); int f=; x=;
- while(!isdigit(c)) {if(c=='-')f=-; c=getchar();}
- while(isdigit(c)) x=x*+c-'',c=getchar();
- x*=f;
- }
- int n,R,C,val[N],f[N],x[N],y[N],z[N],in[N];
- vector<int> g[N],G[N],quex[N],quey[N];
- int dfsc,pre[N],lowlink[N],sccno[N],scccnt;
- stack<int> S; set<Node> xy;
- void dfs(int u) {
- pre[u]=lowlink[u]=++dfsc;
- S.push(u);
- FOR(i,,(int)g[u].size()-) {
- int v=g[u][i];
- if(!pre[v]) {
- dfs(v);
- lowlink[u]=min(lowlink[u],lowlink[v]);
- }
- else if(!sccno[v]) {
- lowlink[u]=min(lowlink[u],pre[v]);
- }
- }
- if(lowlink[u]==pre[u]) {
- ++scccnt;
- for(;;) {
- int x=S.top(); S.pop();
- sccno[x]=scccnt;
- if(x==u) break;
- }
- }
- }
- int dp(int u) {
- int& ans=f[u];
- if(ans) return ans;
- FOR(i,,(int)G[u].size()-)
- ans=max(ans,dp(G[u][i]));
- ans+=val[u];
- return ans;
- }
- void get_graph() {
- FOR(i,,n) {
- read(x[i]),read(y[i]),read(z[i]);
- quex[x[i]].push_back(i),quey[y[i]].push_back(i);
- xy.insert((Node){x[i],y[i],i});
- }
- FOR(i,,n) {
- if(z[i]==) {
- FOR(j,,(int)quex[x[i]].size()-)
- if(i!=quex[x[i]][j]) g[i].push_back(quex[x[i]][j]);
- }
- else if(z[i]==) {
- FOR(j,,(int)quey[y[i]].size()-)
- if(i!=quey[y[i]][j]) g[i].push_back(quey[y[i]][j]);
- } else {
- FOR(dx,-,) FOR(dy,-,) if(dx!=||dy!=) {
- int xx=x[i]+dx,yy=y[i]+dy;
- Node u=*xy.find((Node){xx,yy,});
- if(u.x==xx&&u.y==yy) g[i].push_back(u.id);
- }
- }
- }
- }
- int main() {
- //freopen("in.in","r",stdin);
- //freopen("out.out","w",stdout);
- read(n),read(R),read(C);
- get_graph();
- FOR(i,,n) if(!pre[i]) dfs(i);
- FOR(u,,n) {
- val[sccno[u]]++;
- FOR(j,,(int)g[u].size()-) {
- int v=g[u][j];
- if(sccno[v]!=sccno[u]) {
- in[sccno[v]]++;
- G[sccno[u]].push_back(sccno[v]);
- }
- }
- }
- int ans=;
- FOR(i,,scccnt)
- if(!in[i]) ans=max(ans,dp(i));
- printf("%d\n",ans);
- }
ps:万万没想到,bokeyuan竟然和谐free gate
bzoj 1924 [Sdoi2010]所驼门王的宝藏(构图,SCC,DP)的更多相关文章
- [BZOJ 1924][Sdoi2010]所驼门王的宝藏
1924: [Sdoi2010]所驼门王的宝藏 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 1285 Solved: 574[Submit][Sta ...
- BZOJ 1924: [Sdoi2010]所驼门王的宝藏 【tarjan】
Description 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为“先 知”的Alpaca L. Sotomon 是这个家族的领袖,外人也称其为“所驼门王”.所 驼门王毕生致力于维 ...
- 【刷题】BZOJ 1924 [Sdoi2010]所驼门王的宝藏
Description Input 第一行给出三个正整数 N, R, C. 以下 N 行,每行给出一扇传送门的信息,包含三个正整数xi, yi, Ti,表示该传送门设在位于第 xi行第yi列的藏宝宫室 ...
- 【题解】SDOI2010所驼门王的宝藏(强连通分量+优化建图)
[题解]SDOI2010所驼门王的宝藏(强连通分量+优化建图) 最开始我想写线段树优化建图的说,数据结构学傻了233 虽然矩阵很大,但是没什么用,真正有用的是那些关键点 考虑关键点的类型: 横走型 竖 ...
- [SDOI2010]所驼门王的宝藏
题目描述 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为"先知"的Alpaca L. Sotomon是这个家族的领袖,外人也称其为"所驼门王". ...
- [LuoguP2403][SDOI2010]所驼门王的宝藏
题目描述 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为"先知"的Alpaca L. Sotomon是这个家族的领袖,外人也称其为"所驼门王". ...
- 洛谷 2403 [SDOI2010] 所驼门王的宝藏
题目描述 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为“先知”的Alpaca L. Sotomon是这个家族的领袖,外人也称其为“所驼门王”.所驼门王毕生致力于维护家族的安定与和谐, ...
- Luogu 2403 [SDOI2010]所驼门王的宝藏
BZOJ 1924 内存要算准,我MLE了两次. 建立$n + r + c$个点,对于一个点$i$的坐标为$(x, y)$,连边$(n + x, i)$和$(n + r + y, i)$,代表这一列和 ...
- BZOJ 1924 && Luogu P2403 [SDOI2010]所驼门王的宝藏 恶心建图+缩点DP
记住:map一定要这么用: if(mp[x[i]+dx[j]].find(y[i]+dy[j])!=mp[x[i]+dx[j]].end()) add(i,mp[x[i]+dx[j]][y[i]+dy ...
随机推荐
- C#细节忽略的问题:int 与 int?
int 与 int? 天天都在看,却不知道这2有什么区别呢? 首先说明下这个?的由来吧:C#值类型使不可谓null的,但是sql server的 int 确是可以为null的. 废话不多说直接上代码 ...
- Kinetic使用注意点--animation
new Animation(func, layers) 参数: func:每一帧都会调用一次此函数.此函数接收一个包含四个元素的参数对象,时间单位均为毫秒. { timeDiff:"上一帧和 ...
- 角色控制器 Character Controller
Unity中,1个单位尺寸代表1米.即在Unity中创建一个Cube的尺寸是1x1x1米大小. Unity推荐把人的身高定为大约2个Unity单位高度(2米). 为了截取角色的全身照,需要把角色Ins ...
- js中构造字符串若放入Grails中gsp的<g:link>标签出错
Grails的ajax使用json格式返回,在js中构造字符串时若放入<g:link>标签,字符串构造就会错误 如下就会发生错误,导致回调函数无法执行 function show(obj) ...
- sum(iterable[, start]) 对集合求和
>>> LL [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21] >>> L [3, 4, 5, 6, 7, 8, 9] >> ...
- csuoj 1351: Tree Counting
这是一个动态规划的题: 当初想到要用dp,但是一直想不到状态转移的方程: 题解上的原话: 动态规划,设 g[i]表示总结点数为 i 的方案种数,另设 f[i][j]表示各个孩子的总结点数为i,孩子的个 ...
- easyui源码翻译1.32--panel(面板)
前言 昨天发布了表格datagrid的翻译源码 ,easyui的许多插件有依赖关系 比如datagrid 的渲染需要panel.resizable.linkbutton.pagination 今 ...
- easyui源码翻译1.32--Form(表单)
前言 使用$.fn.form.defaults重写默认值对象下载该插件翻译源码 form提供了各种方法来操作执行表单字段,比如:ajax提交, load, clear等等.当提交表单的时候可以调用va ...
- 安装edX DevStack
概述 edX Developer Stack 就是通常我们所说的Devstack,是为本地开发所设计的一个Vagrant实例. Devstack: 和产品(edx Product Stack)对系统的 ...
- 定时显示提示控件 TToolTip
转载过来的,文章出自: http://www.delphifans.com/infoview/Article_3640.html { 修改者:ghs 日期:20071218 功能:在 ...