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

10 7 7
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

9

【思路】

构图,SCC,DP

因为只有宝藏室有门所以传送到空房间是没有意义的,这样可以将n个宝藏室构图。

求出SCC,对于一个SCC内的任意节点可以互相到达而到达次数没有限制,所以缩点,将点权设为SCC的结点数,这样问题就变成了求DAG上的一条最大点权路,可以用DP求解。

需要注意的是DAG不一定连通。

  

【代码】

  1. #include<set>
  2. #include<stack>
  3. #include<vector>
  4. #include<cstdio>
  5. #include<cstring>
  6. #include<iostream>
  7. #include<algorithm>
  8. #define FOR(a,b,c) for(int a=(b);a<=(c);a++)
  9. using namespace std;
  10.  
  11. const int N = *1e5+;
  12. struct Node{
  13. int x,y,id;
  14. bool operator < (const Node& rhs) const{
  15. return x<rhs.x || (x==rhs.x&&y<rhs.y);
  16. }
  17. };
  18. void read(int& x) {
  19. char c=getchar(); int f=; x=;
  20. while(!isdigit(c)) {if(c=='-')f=-; c=getchar();}
  21. while(isdigit(c)) x=x*+c-'',c=getchar();
  22. x*=f;
  23. }
  24. int n,R,C,val[N],f[N],x[N],y[N],z[N],in[N];
  25. vector<int> g[N],G[N],quex[N],quey[N];
  26. int dfsc,pre[N],lowlink[N],sccno[N],scccnt;
  27. stack<int> S; set<Node> xy;
  28.  
  29. void dfs(int u) {
  30. pre[u]=lowlink[u]=++dfsc;
  31. S.push(u);
  32. FOR(i,,(int)g[u].size()-) {
  33. int v=g[u][i];
  34. if(!pre[v]) {
  35. dfs(v);
  36. lowlink[u]=min(lowlink[u],lowlink[v]);
  37. }
  38. else if(!sccno[v]) {
  39. lowlink[u]=min(lowlink[u],pre[v]);
  40. }
  41. }
  42. if(lowlink[u]==pre[u]) {
  43. ++scccnt;
  44. for(;;) {
  45. int x=S.top(); S.pop();
  46. sccno[x]=scccnt;
  47. if(x==u) break;
  48. }
  49. }
  50. }
  51.  
  52. int dp(int u) {
  53. int& ans=f[u];
  54. if(ans) return ans;
  55. FOR(i,,(int)G[u].size()-)
  56. ans=max(ans,dp(G[u][i]));
  57. ans+=val[u];
  58. return ans;
  59. }
  60.  
  61. void get_graph() {
  62. FOR(i,,n) {
  63. read(x[i]),read(y[i]),read(z[i]);
  64. quex[x[i]].push_back(i),quey[y[i]].push_back(i);
  65. xy.insert((Node){x[i],y[i],i});
  66. }
  67. FOR(i,,n) {
  68. if(z[i]==) {
  69. FOR(j,,(int)quex[x[i]].size()-)
  70. if(i!=quex[x[i]][j]) g[i].push_back(quex[x[i]][j]);
  71. }
  72. else if(z[i]==) {
  73. FOR(j,,(int)quey[y[i]].size()-)
  74. if(i!=quey[y[i]][j]) g[i].push_back(quey[y[i]][j]);
  75. } else {
  76. FOR(dx,-,) FOR(dy,-,) if(dx!=||dy!=) {
  77. int xx=x[i]+dx,yy=y[i]+dy;
  78. Node u=*xy.find((Node){xx,yy,});
  79. if(u.x==xx&&u.y==yy) g[i].push_back(u.id);
  80. }
  81. }
  82. }
  83. }
  84.  
  85. int main() {
  86. //freopen("in.in","r",stdin);
  87. //freopen("out.out","w",stdout);
  88. read(n),read(R),read(C);
  89. get_graph();
  90. FOR(i,,n) if(!pre[i]) dfs(i);
  91. FOR(u,,n) {
  92. val[sccno[u]]++;
  93. FOR(j,,(int)g[u].size()-) {
  94. int v=g[u][j];
  95. if(sccno[v]!=sccno[u]) {
  96. in[sccno[v]]++;
  97. G[sccno[u]].push_back(sccno[v]);
  98. }
  99. }
  100. }
  101. int ans=;
  102. FOR(i,,scccnt)
  103. if(!in[i]) ans=max(ans,dp(i));
  104. printf("%d\n",ans);
  105. }

ps:万万没想到,bokeyuan竟然和谐free gate

bzoj 1924 [Sdoi2010]所驼门王的宝藏(构图,SCC,DP)的更多相关文章

  1. [BZOJ 1924][Sdoi2010]所驼门王的宝藏

    1924: [Sdoi2010]所驼门王的宝藏 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 1285  Solved: 574[Submit][Sta ...

  2. BZOJ 1924: [Sdoi2010]所驼门王的宝藏 【tarjan】

    Description 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为“先 知”的Alpaca L. Sotomon 是这个家族的领袖,外人也称其为“所驼门王”.所 驼门王毕生致力于维 ...

  3. 【刷题】BZOJ 1924 [Sdoi2010]所驼门王的宝藏

    Description Input 第一行给出三个正整数 N, R, C. 以下 N 行,每行给出一扇传送门的信息,包含三个正整数xi, yi, Ti,表示该传送门设在位于第 xi行第yi列的藏宝宫室 ...

  4. 【题解】SDOI2010所驼门王的宝藏(强连通分量+优化建图)

    [题解]SDOI2010所驼门王的宝藏(强连通分量+优化建图) 最开始我想写线段树优化建图的说,数据结构学傻了233 虽然矩阵很大,但是没什么用,真正有用的是那些关键点 考虑关键点的类型: 横走型 竖 ...

  5. [SDOI2010]所驼门王的宝藏

    题目描述 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为"先知"的Alpaca L. Sotomon是这个家族的领袖,外人也称其为"所驼门王". ...

  6. [LuoguP2403][SDOI2010]所驼门王的宝藏

    题目描述 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为"先知"的Alpaca L. Sotomon是这个家族的领袖,外人也称其为"所驼门王". ...

  7. 洛谷 2403 [SDOI2010] 所驼门王的宝藏

    题目描述 在宽广的非洲荒漠中,生活着一群勤劳勇敢的羊驼家族.被族人恭称为“先知”的Alpaca L. Sotomon是这个家族的领袖,外人也称其为“所驼门王”.所驼门王毕生致力于维护家族的安定与和谐, ...

  8. Luogu 2403 [SDOI2010]所驼门王的宝藏

    BZOJ 1924 内存要算准,我MLE了两次. 建立$n + r + c$个点,对于一个点$i$的坐标为$(x, y)$,连边$(n + x, i)$和$(n + r + y, i)$,代表这一列和 ...

  9. 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 ...

随机推荐

  1. C#细节忽略的问题:int 与 int?

    int 与 int? 天天都在看,却不知道这2有什么区别呢? 首先说明下这个?的由来吧:C#值类型使不可谓null的,但是sql server的 int 确是可以为null的. 废话不多说直接上代码 ...

  2. Kinetic使用注意点--animation

    new Animation(func, layers) 参数: func:每一帧都会调用一次此函数.此函数接收一个包含四个元素的参数对象,时间单位均为毫秒. { timeDiff:"上一帧和 ...

  3. 角色控制器 Character Controller

    Unity中,1个单位尺寸代表1米.即在Unity中创建一个Cube的尺寸是1x1x1米大小. Unity推荐把人的身高定为大约2个Unity单位高度(2米). 为了截取角色的全身照,需要把角色Ins ...

  4. js中构造字符串若放入Grails中gsp的<g:link>标签出错

    Grails的ajax使用json格式返回,在js中构造字符串时若放入<g:link>标签,字符串构造就会错误 如下就会发生错误,导致回调函数无法执行 function show(obj) ...

  5. sum(iterable[, start]) 对集合求和

    >>> LL [1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21] >>> L [3, 4, 5, 6, 7, 8, 9] >> ...

  6. csuoj 1351: Tree Counting

    这是一个动态规划的题: 当初想到要用dp,但是一直想不到状态转移的方程: 题解上的原话: 动态规划,设 g[i]表示总结点数为 i 的方案种数,另设 f[i][j]表示各个孩子的总结点数为i,孩子的个 ...

  7. easyui源码翻译1.32--panel(面板)

    前言 昨天发布了表格datagrid的翻译源码 ,easyui的许多插件有依赖关系  比如datagrid 的渲染需要panel.resizable.linkbutton.pagination   今 ...

  8. easyui源码翻译1.32--Form(表单)

    前言 使用$.fn.form.defaults重写默认值对象下载该插件翻译源码 form提供了各种方法来操作执行表单字段,比如:ajax提交, load, clear等等.当提交表单的时候可以调用va ...

  9. 安装edX DevStack

    概述 edX Developer Stack 就是通常我们所说的Devstack,是为本地开发所设计的一个Vagrant实例. Devstack: 和产品(edx Product Stack)对系统的 ...

  10. 定时显示提示控件 TToolTip

    转载过来的,文章出自: http://www.delphifans.com/infoview/Article_3640.html {    修改者:ghs    日期:20071218    功能:在 ...