Description

Input

第一行给出三个正整数 N, R, C。 以下 N 行,每行给出一扇传送门的信息,包含三个正整数xi, yi, Ti,表示该传送门设在位于第 xi行第yi列的藏宝宫室,类型为 Ti。Ti是一个1~3间的整数, 1表示可以传送到第 xi行任意一列的“横天门”,2表示可以传送到任意一行第 yi列的“纵寰门”,3表示可以传送到周围 8格宫室的“自由门”。 保证 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
HINT

测试点编号 N R C 1 16 20 20 2 300 1,000 1,000 3 500 100,000 100,000 4 2,500 5,000 5,000 5 50,000 5,000 5,000 6 50,000 1,000,000 1,000,000 7 80,000 1,000,000 1,000,000 8 100,000 1,000,000 1,000,000 9 100,000 1,000,000 1,000,000 10 100,000 1,000,000 1,000,000

Source

压强联通分量然后缩点
然后DAG上SPFA求个最长路
跑的又慢内存又大系列…因为一开始给缩点前的图开小内存了一直REQAQ

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define MAXN 110000
using namespace std;
int n,r,c,ans;
void in(int &x)
{char ch=getchar();x=0;while (!(ch>='0'&&ch<='9')) ch=getchar();while (ch>='0'&&ch<='9')    x=x*10+ch-'0',ch=getchar();
}
struct node
{int x,y,opt;
}s[MAXN];
struct edge
{int to,w;edge *next;
};
struct Map1
{int top;edge e[MAXN*50];edge *prev[MAXN];Map1(){top=0;memset(e,0,sizeof(e));memset(prev,0,sizeof(prev));}void insert(int u,int v,int w){if (u==v)   return;e[++top].to=v;e[top].next=prev[u];prev[u]=&e[top];e[top].w=w;}
}m1;
struct Map2
{int top;edge e[MAXN*10];edge *prev[MAXN];Map2(){top=0;memset(e,0,sizeof(e));memset(prev,0,sizeof(prev));}void insert(int u,int v,int w){if (u==v)   return;e[++top].to=v;e[top].next=prev[u];prev[u]=&e[top];e[top].w=w;}
}m2;
int raw[MAXN*10],pre_raw[MAXN*10],col[MAXN*10],pre_col[MAXN*10];
bool vis[MAXN];
int dis[MAXN],In[MAXN],Out[MAXN],sum[MAXN];
int dfn[MAXN],stack[MAXN],low[MAXN],ind,scc,block[MAXN];
void dfs(int x)
{vis[x]=1;stack[++stack[0]]=x;low[x]=dfn[x]=++ind;for (edge *i=m1.prev[x];i;i=i->next)if (block[i->to]==0){if (!vis[i->to])    dfs(i->to);low[x]=min(low[x],low[i->to]);}if (low[x]==dfn[x]){scc++;while (stack[stack[0]+1]!=x)    block[stack[stack[0]--]]=scc;}
}
void SPFA()//最长路
{memset(vis,0,sizeof(vis));queue<int>  que;for (int i=1;i<=scc;i++){dis[i]=-1;if (In[i]==0)   que.push(i),vis[i]=1,dis[i]=0;}while (!que.empty()){int x=que.front();que.pop();for (edge *i=m2.prev[x];i;i=i->next)if (dis[x]+i->w>dis[i->to]){dis[i->to]=dis[x]+i->w;if (!vis[i->to]){vis[i->to]=1;que.push(i->to);}}vis[x]=0;}for (int i=1;i<=scc;i++)if (!Out[i])    dis[i]+=sum[i];for (int i=1;i<=scc;i++)    ans=max(ans,dis[i]);
}
int main()
{in(n);in(r);in(c);for (int i=1;i<=n;i++)//一开始的图 {in(s[i].x);in(s[i].y);in(s[i].opt);raw[i]=pre_raw[s[i].x];pre_raw[s[i].x]=i;col[i]=pre_col[s[i].y];pre_col[s[i].y]=i;}for (int i=1;i<=n;i++){if (s[i].opt==1)for (int x=pre_raw[s[i].x];x;x=raw[x])  m1.insert(i,x,0);elseif (s[i].opt==2)for (int x=pre_col[s[i].y];x;x=col[x])  m1.insert(i,x,0);       elseif (s[i].opt==3){for (int x=pre_raw[s[i].x+1];x;x=raw[x])if (s[x].y>=s[i].y-1&&s[x].y<=s[i].y+1) m1.insert(i,x,0);for (int x=pre_raw[s[i].x];x;x=raw[x])if (s[x].y>=s[i].y-1&&s[x].y<=s[i].y+1) m1.insert(i,x,0);for (int x=pre_raw[s[i].x-1];x;x=raw[x])if (s[x].y>=s[i].y-1&&s[x].y<=s[i].y+1) m1.insert(i,x,0);}}for (int i=1;i<=n;i++)//缩点 if (block[i]==0)    dfs(i);for (int i=1;i<=n;i++)  sum[block[i]]++;for (int j=1;j<=n;j++)//重构图 for (edge *i=m1.prev[j];i;i=i->next)if (block[i->to]!=block[j]) m2.insert(block[j],block[i->to],sum[block[j]]),In[block[i->to]]++,Out[block[j]]++;SPFA();printf("%d\n",ans);
}

【SDOI2010】【BZOJ1924】所驼门王的宝藏相关推荐

  1. 【BZOJ1924】【SDOI2010】所驼门王的宝藏(Tarjan,SPFA)

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

  2. BZOJ1924: [Sdoi2010]所驼门王的宝藏

    1924: [Sdoi2010]所驼门王的宝藏 Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 1303  Solved: 582 [Submit][S ...

  3. P2403 [SDOI2010]所驼门王的宝藏

    P2403 [SDOI2010]所驼门王的宝藏 题意: R * C的地图上有n个宝藏,给你n个宝藏的坐标,每个宝藏的位置上还有一个传送门,传送门有三种类型,1.可以传送到同行的其他宝藏位置,2.可以传 ...

  4. 8.18 NOIP模拟测试25(B) 字符串+乌鸦喝水+所驼门王的宝藏

    T1 字符串 卡特兰数 设1为向(1,1)走,0为向(1,-1)走,限制就是不能超过$y=0$这条线,题意转化为从(0,0)出发,走到(n+m,n-m)且不越过$y=0$,然后就裸的卡特兰数,$ans ...

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

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

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

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

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

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

  8. P2403 [SDOI2010]所驼门王的宝藏(强连通分量)(拓扑排序)

    文章目录 题目描述 解析 代码 洛谷传送门 题目描述 解析 看题目要求很容易想到强连通分量缩点加拓扑dp 但是问题在于存图 第一感就是和暴力和每个点连边 但那样无论点数和边数都很爆炸 随后我们发现这个 ...

  9. 洛咕 P2403 [SDOI2010]所驼门王的宝藏

    简单tarjan. 一行的横天门如果暴力连边会被卡成平方,所以只要相邻两个横天门连双向边,再随便选一个横天门向整行连边即可.纵寰门同理.ziyou门直接map暴力连边. 然后tarjan直接dp. / ...

最新文章

  1. oracle事务数统计,oracle函数与事务
  2. BYTE,WORD,DWORD的大小及一些特殊的高低位宏(取高位 取低位)
  3. pytorch问题汇总
  4. Wisdom RESTClient支持自动化测试并可以生成API文档
  5. SQL server 2005中无法新建作用(Job)的问题
  6. 新一代大数据处理引擎 Apache Flink
  7. background图片不显示_一种解决Retina屏幕1px边框显示问题的方案
  8. vue 编辑弹框,编辑页面,列表数据也会跟着变
  9. Vmware下安装CentOS6的特别注意,一定要在虚拟机上电时候按DEL,选择操作系统启动方式...
  10. iOS设计模式——委托(delegate)
  11. Python内存优化,节省内存字典ConstDict
  12. ARP协议及局域网断网攻击(scapy)
  13. SQL Server建库建表命令
  14. 【安全知识分享】PPTX|新安全生产法解读(66页)(附下载)
  15. android apk sign,apk文件的sign以及align命令
  16. Nodejs中使用ioredis库
  17. c语言程序设计(西安理工大学),C语言程序设计-西安理工大学三电实验教学中心!.doc...
  18. LC117 Populating Next Right Pointers in Each Node II
  19. TwinCAT更改背景主题颜色
  20. 人工智能发展的三起两落

热门文章

  1. 从键盘任意输入一个年号,判断它是否是闰年。
  2. docker国内镜像加速配置
  3. RocketMQ 问题记录
  4. windbg下载符号方法
  5. 关于自己学习安卓的体会
  6. 一百元的钞票能拍卖出多少钱?
  7. 固体物理题库之名词解释
  8. wannier拟合能带总是拟合不上_VASP+Wannier90方法拟合单层MoS2的能带,请问如何改善拟合结果?...
  9. 自媒体剪辑视频都在用的6个音效素材网站。
  10. 程序员怎样才能实现财富自由