热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

bzoj2208[Jsoi2010]连通数

DescriptionInput输入数据第一行是图顶点的数量,一个正整数N。接下来N行,每行N个字符。第i行第j列的1表示顶点i到j有边,

Description

Input

输入数据第一行是图顶点的数量,一个正整数N。 接下来N行,每行N个字符。第i行第j列的1表示顶点i到j有边,0则表示无边。

Output

输出一行一个整数,表示该图的连通数。

Sample Input

3
010
001
100

Sample Output

9

HINT

 

对于100%的数据,N不超过2000。

原来我想的是用树形dp搞,但是发现会重复统计
比如3个点3条边,1->2,2->3,1->3,先建反边按拓扑排序的顺序做:3更新1、2,但是2更新1的时候1已经统计过了3,所以重复记数
考虑状压一下,保存每个点能到达的点,更新的时候就不会重复统计了
说到状压,必须讲下bitset大法好!
当然缩点还是省不了的

#include
#include
#include
#define LL long long
#define N 2010
using namespace std;
inline LL read()
{LL x&#61;0,f&#61;1;char ch&#61;getchar();while(ch<&#39;0&#39;||ch>&#39;9&#39;){if(ch&#61;&#61;&#39;-&#39;)f&#61;-1;ch&#61;getchar();}while(ch>&#61;&#39;0&#39;&&ch<&#61;&#39;9&#39;){x&#61;x*10&#43;ch-&#39;0&#39;;ch&#61;getchar();}return x*f;
}
int n,cnt,cnt2,cnt3,tt,ans;
bitset flag[N];
char ch[N];
struct edge{int to,next;}e[N*N],e2[N*N];
int head[N],head2[N],dfn[N],low[N];
int belong[N],size[N],son[N];
int zhan[N],top,q[N];
bool inset[N],mrk[N];
int I[N],O[N];
inline void insert(int u,int v)
{e[&#43;&#43;cnt].to&#61;v;e[cnt].next&#61;head[u];head[u]&#61;cnt;
}
inline void ins(int u,int v)
{e2[&#43;&#43;cnt2].to&#61;v;e2[cnt2].next&#61;head2[u];head2[u]&#61;cnt2;
}
inline void dfs(int x)
{dfn[x]&#61;low[x]&#61;&#43;&#43;tt;zhan[&#43;&#43;top]&#61;x;inset[x]&#61;1;for (int i&#61;head[x];i;i&#61;e[i].next)if (!dfn[e[i].to]){dfs(e[i].to);low[x]&#61;min(low[x],low[e[i].to]);}else if (inset[e[i].to]) low[x]&#61;min(low[x],dfn[e[i].to]);if (dfn[x]&#61;&#61;low[x]){int p&#61;-1;cnt3&#43;&#43;;while (p!&#61;x){p&#61;zhan[top--];belong[p]&#61;cnt3;inset[p]&#61;0;size[cnt3]&#43;&#43;;}}
}
inline void tarjan()
{for (int i&#61;1;i<&#61;n;i&#43;&#43;)if (!dfn[i])dfs(i);
}
int main()
{n&#61;read();for (int i&#61;1;i<&#61;n;i&#43;&#43;){scanf("%s",ch&#43;1);for (int j&#61;1;j<&#61;n;j&#43;&#43;)if (ch[j]&#61;&#61;&#39;1&#39;)insert(i,j);}tarjan();for (int i&#61;1;i<&#61;n;i&#43;&#43;)for (int j&#61;head[i];j;j&#61;e[j].next)if (belong[e[j].to]!&#61;belong[i]){ins(belong[e[j].to],belong[i]);flag[belong[i]][belong[e[j].to]]&#61;1;I[belong[i]]&#43;&#43;;O[belong[belong[e[i].to]]]&#43;&#43;;}int t&#61;0,w&#61;0;for (int i&#61;1;i<&#61;cnt3;i&#43;&#43;){flag[i][i]&#61;1;if (!I[i])q[w&#43;&#43;]&#61;i,mrk[i]&#61;1;}while (t!&#61;w){int now&#61;q[t&#43;&#43;];for (int i&#61;head2[now];i;i&#61;e2[i].next){int to&#61;e2[i].to;if (mrk[to])continue;flag[to]|&#61;flag[now];I[to]--;if (!I[to]){mrk[to]&#61;1;q[w&#43;&#43;]&#61;to;}}}for (int i&#61;1;i<&#61;cnt3;i&#43;&#43;)for (int j&#61;1;j<&#61;cnt3;j&#43;&#43;)if (flag[i][j])ans&#43;&#61;size[i]*size[j];printf("%d\n",ans);return 0;
}

  


转:https://www.cnblogs.com/zhber/p/4216202.html



推荐阅读
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 本文介绍了一个题目的解法,通过二分答案来解决问题,但困难在于如何进行检查。文章提供了一种逃逸方式,通过移动最慢的宿管来锁门时跑到更居中的位置,从而使所有合格的寝室都居中。文章还提到可以分开判断两边的情况,并使用前缀和的方式来求出在任意时刻能够到达宿管即将锁门的寝室的人数。最后,文章提到可以改成O(n)的直接枚举来解决问题。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 3.223.28周学习总结中的贪心作业收获及困惑
    本文是对3.223.28周学习总结中的贪心作业进行总结,作者在解题过程中参考了他人的代码,但前提是要先理解题目并有解题思路。作者分享了自己在贪心作业中的收获,同时提到了一道让他困惑的题目,即input details部分引发的疑惑。 ... [详细]
  • 本文详细介绍了如何使用MySQL来显示SQL语句的执行时间,并通过MySQL Query Profiler获取CPU和内存使用量以及系统锁和表锁的时间。同时介绍了效能分析的三种方法:瓶颈分析、工作负载分析和基于比率的分析。 ... [详细]
author-avatar
天佑千行
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有