传送门

这道题的题目描述看起来很奇怪。实际上的意思是要求在这个有向图之内能到达的点对有多少,解释一下题里的图片就是(1,1),(1,2),(1,3),(1,4),(1,5),(2,2),(2,3),(2,4),(2,5),(3,3),(3,4),(3,5),(4,4),(5,5)一共14个。

先小声说一下这题固输n^2可以得到90pts……

然后我们首先考虑非常暴力的做法,就是先手tarjan缩点,存每个联通块里面的节点个数,在新图上直接进行dfs,把每个点所能到达的点搜出来就行。

我也不知道能跑多快……但是如上文所述你固输都有90所以数据比较水,我一共跑了50ms就过了。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<queue>
#include<set>
#include<bitset>
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
#define enter putchar('\n')using namespace std;
typedef long long ll;
const int M = 2005;
const int N = 1000005;
const double eps = 1e-6;
const double fi = 0.61803399;
const double fim = 0.38196601;int read()
{int ans = 0,op = 1;char ch = getchar();while(ch < '0' || ch > '9'){if(ch == '-') op = -1;ch = getchar();}while(ch >= '0' && ch <= '9'){ans *= 10;ans += ch - '0';ch = getchar();}return ans * op;
}struct edge
{int next,to,from;
}e[N<<2],e1[N<<2];
int n,g[M][M],dfn[M],low[M],stack[M],top,idx,cur,ecnt,head[M],sd[M],h[M],sz[M],ecnt1,q[M],curr,tot;
char s[M];
ll ans;
bool vis[M],pd[M];void add(int x,int y)
{e[++ecnt].to = y;e[ecnt].from = x;e[ecnt].next = head[x];head[x] = ecnt;
}void tarjan(int x)
{low[x] = dfn[x] = ++idx;vis[x] = 1,stack[++top] = x;for(int i = head[x];i;i = e[i].next){if(!dfn[e[i].to]) tarjan(e[i].to),low[x] = min(low[x],low[e[i].to]);else if(vis[e[i].to]) low[x] = min(low[x],low[e[i].to]);}if(low[x] == dfn[x]){int p;cur++;while(p = stack[top--]){sd[p] = cur,vis[x] = 0,sz[cur]++;if(x == p) break;}}
}void dfs(int x)
{
tot += sz[x],pd[x] = 1,q[++curr] = x;for(int i = h[x];i;i = e1[i].next){if(pd[e1[i].to]) continue;dfs(e1[i].to);}
}int main()
{n = read();rep(i,1,n){scanf("%s",s);rep(j,0,n-1) if(s[j] == '1') add(i,j+1);}rep(i,1,n) if(!dfn[i]) tarjan(i);rep(i,1,ecnt){int r1 = sd[e[i].from],r2 = sd[e[i].to];if(r1 != r2){e1[++ecnt1].to = r2;e1[ecnt1].next = h[r1];e1[ecnt1].from = r1;h[r1] = ecnt1;}}rep(i,1,cur){rep(i,1,curr) q[i] = 0;tot = 0;dfs(i);rep(i,1,curr) pd[q[i]] = 0;ans += tot * sz[i];}printf("%lld\n",ans);return 0;
}

这样很神奇你的搜索就过了……

之后我们再说一种别的做法,他有一个高大上的名字,叫Floyd传递闭包!

这个东西可以判断有向图两点之间是否连通,一开始它的形状和初始给定的邻接矩阵是一样的,不过大对角线上的点都变成了1.

正常的dp是三重循环枚举,dp[i][j] = dp[i][k] & dp[k][j]。不过这样枚举O(n^3)会T,然后我们发现只有能和不能到两种状态,所以我们引入一种强大的东西——bitset来帮我们优化。

使用bitset压缩一行的状态,这样的话转移方程就变成了dp[i] |= dp[j].这样我们只需要O(n^3/32)的复杂度,就可以过了。

看一下代码(炒鸡短)

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<queue>
#include<set>
#include<bitset>
#define rep(i,a,n) for(int i = a;i <= n;i++)
#define per(i,n,a) for(int i = n;i >= a;i--)
#define enter putchar('\n')using namespace std;
typedef long long ll;
const int M = 5005;
const double eps = 1e-6;
const double fi = 0.61803399;
const double fim = 0.38196601;int read()
{int ans = 0,op = 1;char ch = getchar();while(ch < '0' || ch > '9'){if(ch == '-') op = -1;ch = getchar();}while(ch >= '0' && ch <= '9'){ans *= 10;ans += ch - '0';ch = getchar();}return ans * op;
}bitset <2005> f[M];
int n;
char s[M];
ll ans;int main()
{n = read();rep(i,1,n){scanf("%s",s);rep(j,0,n-1) if(s[j] == '1') f[i][j+1] = 1;f[i][i] = 1;}rep(i,1,n)rep(j,1,n) if(f[j][i]) f[j] |= f[i];rep(i,1,n) ans += f[i].count();printf("%lld\n",ans);return 0;
}

转载于:https://www.cnblogs.com/captain1/p/9681021.html

JSOI2010 联通数相关推荐

  1. 打造大数据和AI能力底座 联通大数据深度参与“新基建”

    年初至今,国家关于"新基建"的政策持续发布,引起社会各界广泛关注.目前来看,官方定义的新型基础设施主要包括信息基础设施.融合基础设施.创新基础设施三方面内容.疫情过后,新型基础设施 ...

  2. 联通新措施上线了,一文带你探索联通大数据的前世今生

    3月21日闭市后,中国联通上市公司披露2月份运营数据公告.围绕网络强国.数字中国.智慧社会建设,为更好地反映公司抓住新机遇.拥抱新变化.实现新发展的积极进展,中国联通打破20年来上市传统,首次系统优化 ...

  3. Region相关算子

    Region特征分为三部分 (1)基础特征:region面积,中心,宽高,左上角右下角坐标,等效椭圆长半轴短半轴方向,洞数及其面积,粗糙度,联通数,最大半径等. (2)开关特征:外接圆半径,内接圆半径 ...

  4. 中国联通数字乡村白皮书2.0 附下载

    2022年8月19日,2022年助力乡村振兴推进会上,中国联通正式上线了"联通数村"APP,迭代升级<中国联通数字乡村白皮书>至2.0版本. 关注公众号:[互联互通社区 ...

  5. 山东专升本计算机第一章-计算机信息技术与计算机文化

    计算机信息技术与计算机文化 计算机中的信息表示 数制及其转换 数制:用进位的原则进行计数数码:数制中表示基本数值大小的不同数字符号基数:一种数制所使用的数码个数位权:数码在不同位置的权值 数制的转换 ...

  6. 2023年你最值得了解的信息技术-AI篇(一)

    列表 85 - 其他 辽宁省 大连优联智能 自动化生产线提供商 未融资 大连优联智能是一家自动化生产线提供商,集规划设计.制造安装.系统集成.视觉检测及AI数据智能分析于一体,可为汽车车身及发动机制造 ...

  7. 7-6 公路村村通 (30 分)

    现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本. 输入格式: 输入数据包括城镇数目正整数N(≤1000)和候选道路数目M(≤3N) ...

  8. 联通光纤限制连接数_从数百万个光纤(而不是数千个线程)中查询数据库

    联通光纤限制连接数 jOOQ是在Java中执行SQL的好方法,而Quasar光纤带来了大大提高的并发性 我们很高兴在平行世界的 Fabio Tudone的jOOQ博客上宣布另一个非常有趣的来宾帖子. ...

  9. 有向图的强联通分量之:【求最长链】【求最长链的方案数(图论中的方案数DP)】【最长链和最大半联通子图 节点数相同】【最长链与最大半联通子图等价又不完全等价】

    注意了: 最长链与最大半联通子图是等价又不完全等价的. 最大半联通子图的节点数 会 与最长链的节点数相同, 但是边数的话,最大半联通子图还是会加进 两个点之间的所有边 但是本题的主要目的是求 最长链上 ...

最新文章

  1. canvas初体验之加载图片
  2. ndpi 流量协议分析
  3. CMake 指定安装目录
  4. 军用软件概算计价规范_超强干货分享:547建筑工程计量与计价,帮你轻松掌握计量与计价...
  5. web页面屏蔽鼠标右键
  6. [Python图像处理] 三十四.数字图像处理基础与几何图形绘制万字详解(推荐)
  7. System.IO.Pipelines: .NET高性能IO
  8. 【POJ - 2762】Going from u to v or from v to u?(Tarjan缩点,树形dp 或 拓扑排序,欧拉图相关)
  9. 进入opencv内部函数调试
  10. vue底部选择器_vue实现动态显示与隐藏底部导航的方法分析
  11. android qq登录 获取用户信息吗,免登录 只需要一个QQ号就能获取QQ头像和QQ昵称 获取QQ用户信息API...
  12. 悲情天才沃尔特·皮兹
  13. Sublime Text4添加配色主题
  14. pythonclass全局变量_python类怎么定义全局变量
  15. SlickEdit基本设置
  16. 汉王速录笔linux驱动下载,汉王速录笔v600驱动 官方版
  17. 红警3 联网对战平台
  18. python图片批量转换成灰度图像
  19. 司空见惯 - 洪荒之力
  20. sql server日期时间转字符串

热门文章

  1. nslookup命令dns请求超时_网络工程师之nslookup命令
  2. php使用位运算来实现日留存的算法
  3. 【PAT (Advanced Level) Practice】1120 Friend Numbers (20 分)
  4. 【Linux入门到精通系列讲解】Centos 7软件安装的三种方式
  5. 条件限制select into_SQL全部知识点(夺回控制台掌控权,转义符,SELECT特定列,AND,OR,查询数值,比较运算)...
  6. 公司网络推广教你网站初期SEO优化该如何做?
  7. SEO优化技巧之Alt标签的使用方法
  8. 网站标题怎么写可以被搜索引擎快速识别?
  9. 网站推广——对于网站推广公司来说应如何帮助企业实现网站优化?
  10. 网站SEO优化值得收藏的技巧介绍