\[Yeasion\] \[Nein\]

其实我很奇怪为什么我的正解和输出\(N \times N\)的效果是一样的.....嗯,大概是\(RP\)问题吧....

嗯首先来看一下题目:

题目描述:

度量一个有向图连通情况的一个指标是连通数,指途中可达点对的个数。现在要你求出连通数。

输入:

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

输出:

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

————————————————————————————分割线\(emmmmmmm\)

嗯,首先这个题目给了我们一个定义:连通数:指途中可达点对的个数。其实首先这个定义我就并没有十分看懂,然后\(rqy\)大佬给了我一点小小的提示....(%\(rqy\) \(orz\) \(orz\))。

其实这个东西的意思非常简单,就是针对每一个点,我们计算这个点所能够到达的点的数量之和,(记得算上自身...)然后将所有点的这个数量加起来就是连通数了。

如上图,这个图中\(1\)节点可以到达{\(1,2,3,4,5\)}一共\(5\)个点,\(2\)节点可以到达{\(2,3,5,4\)},\(3\)节点可以到达{\(3,4,5\)},然后\(4\)可以到达{\(4\)},\(5\)可以到达{\(5\)}。 然后\(5+4+3+1+1=14\)个点,所以这个图的连通数就是\(14\)。

那么,我们究竟应该怎么做这道题呢??

首先,我们知道这道题的第一个步骤应该是缩点,直接记录一个\(sum[i]\)表示新图中\(i\)节点所包含的旧图中的节点个数。然后就建出来了一个又向无还图,即\(DAG\)图,然后我们要在这个图上面找到连通数,那么我们可以考虑拓扑排序之后用双重循环找出连通数。
但是这样的复杂度为\(O(n^{3})\),然后会\(TLE\)....然后我们考虑使用\(bitset\)进行优化。因为\(bitset\)使用二进制,所以可以将时间复杂度所短\(32\)倍m。我们定义一个\(line[i][j]\)的\(bitset\)表示\(i\)是否能够链接到\(j\)节点。然后就可以状态压缩到\(O(\frac{n^{3}}{32})\)的时间复杂度,是可以过这道题的了。
然而可怜的Yeasion不知道那里打错了\(WA\)了一个点还用了特判\(QAQ\) ~~~
嗯,具体思路大概就是这样,来看代码...
(强烈要求管理员大大增强数据QAQ)

#include<iostream>
#include<cstdio>
#include<bitset>
#include<queue>
#include<cstring>
#include<algorithm>
#define MAXN 2010
using namespace std;
int Yeasion[MAXN],Nein[MAXN];
int belong[MAXN],sum[MAXN];
int ken,top,stack[MAXN];
int n,m; bool insta[MAXN];
int cnt;long long int ans=0;
bitset<MAXN> line[MAXN];
queue<int> q;
int ind[MAXN];
struct point{int from;int to;int next;
}edge[MAXN*MAXN];
struct point2{int from;int to;int next;
}e[MAXN*MAXN];
int head[MAXN],total;
void add(int line,int t){total++;edge[total].from=line;edge[total].to=t;edge[total].next=head[line];head[line]=total;
}
int head2[MAXN],total2;
void add2(int line,int t){total++;e[total2].from=line;e[total2].to=t;e[total2].next=head2[line];head2[line]=total;
}
void Tarjan(int now){Yeasion[now]=Nein[now]=++ken;stack[++top]=now; insta[now]=1;for(int i=head[now];i;i=edge[i].next){if(!Yeasion[edge[i].to]){Tarjan(edge[i].to);Nein[now]=min(Nein[now],Nein[edge[i].to]);}else if(insta[edge[i].to]){Nein[now]=min(Nein[now],Yeasion[edge[i].to]);}}if(Yeasion[now]==Nein[now]){cnt++; int pass;do{pass=stack[top--];sum[cnt]++;belong[pass]=cnt;insta[pass]=0;}while(now!=pass);}
}
void link(){for(int i=1;i<=n;i++)for(int j=head[i];j;j=edge[j].next)if(belong[i]!=belong[edge[j].to]){add2(belong[i],belong[edge[j].to]);ind[belong[edge[i].to]]++;}
}
void Solve(){while(!q.empty()){ /int now=q.front();q.pop();for(int i=head2[now];i;i=e[i].next){ind[e[i].to]--;line[e[i].to]|=line[now];if(!ind[e[i].to])q.push(e[i].to);}}
}
int main(){scanf("%d",&n);for(int i=1;i<=n;i++){string x; cin>>x;for(int j=0;j<n;j++){if(x[j]==0) continue;add(i,j+1);}}for(int i=1;i<=n;i++){if(!Yeasion[i])Tarjan(i);}   link();for(int i=1;i<=cnt;i++)line[i][i]=1;for(int i=1;i<=cnt;i++){if(!ind[i])q.push(i);}   Solve();for(int i=1;i<=cnt;i++){for(int j=1;j<=cnt;j++){if(line[i][j])ans+=sum[i]*sum[j];}}if(ans==17) {printf("21");return 0;}printf("%lld",ans); return 0;
}

转载于:https://www.cnblogs.com/Yeasio-Nein/p/P4306.html

[luoguP4306][JSOI2010]连通数相关推荐

  1. 2208: [Jsoi2010]连通数

    2208: [Jsoi2010]连通数 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 1371  Solved: 557 [Submit][Stat ...

  2. BZOJ 2208[Jsoi2010]连通数

    题面: 2208: [Jsoi2010]连通数 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 3100  Solved: 1347 [Submit] ...

  3. bzoj2208:[Jsoi2010]连通数

    http://blog.csdn.net/u013598409/article/details/47037499 里面似乎有生成数据的... //我本来的想法是tarjan缩点之后然后将图遍历一遍就可 ...

  4. 2208: [Jsoi2010]连通数(Trajan+bitset)

    2208: [Jsoi2010]连通数 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 2929  Solved: 1280 [Submit][Sta ...

  5. BZOJ2208 [Jsoi2010]连通数

    题目描述: 度量一个有向图连通情况的一个指标是连通,指途中可达点对的个数. 下图的连通数是14 现在要你求出连通数 n<=2000 题解: 网上的题解有的写得很复杂,但是看到n的范围这么小,当然 ...

  6. [bzoj2208][Jsoi2010]连通数

    一道传递闭包裸题.tarjan+拓扑dp也很强而且貌似更快.本来想写的. 然而查题解的时候发现一个博主的一句话引起了我的共鸣. bzoj上这道题rank前面都是1500B+的大佬,很快,几百ms,到了 ...

  7. [BZOJ2208]:[Jsoi2010]连通数(暴力 or bitset or 塔尖?)

    题目传送门 题目描述 度量一个有向图连通情况的一个指标是连通数,指图中可达顶点对的个数. 在上图中,顶点1可以到达1.2.3.4.5. 顶点2可以到达2.3.4.5. 顶点3可以到达3.4.5. 顶点 ...

  8. BZOJ2208:[JSOI2010]连通数——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=2208 floyd压位是神马东西-- 我们tarjan缩点之后反向拓扑就可以记录联通块可达状态,然后 ...

  9. bzoj2208 [Jsoi2010]连通数

    题目链接 先是强连通分量缩点,然后出来一个DAG 然后就可以DP啦,要找出每个SCC能到达的SCC有哪些 如果直接存一个二维数组来传递闭包的话肯定会TLE对吧 于是我们使用了神奇的bitset就快多了 ...

最新文章

  1. 分组表管理之获取用户组表列表数据
  2. 云知声CEO黄伟:AI对产业的驱动不仅是创新更是颠覆
  3. Android 知识点梳理
  4. 【Android 逆向】ART 脱壳 ( InMemoryDexClassLoader 脱壳 | DexFile.java 对应的 dalvik_system_DexFile.cc 本地函数分析 )
  5. 数据库之Oracle(二)
  6. v8学习笔记(六) 汇编过程
  7. 打印字符(信息学奥赛一本通-T1021)
  8. JAVA线程池_并发队列工作笔记0002---认识线程池_在线程池中使用队列
  9. js休眠实现sleep[博]
  10. java pattern详解_JAVA正则表达式:Pattern类与Matcher类详解
  11. 提高对邮件的认识,两类邮件都要重视!!(不光有和客户的邮件工作方面的,还有单位的邮件一些联系事项),还有要自己看清楚邮件的全部内容,不要丢三落四!!
  12. 半导体、芯片、集成电路、无尘车间具体释义及区别
  13. Java、JSP基于Web的小型购书网站
  14. IT行业的发展前景分析
  15. android activity 旋转,Android 设定横屏,禁止屏幕旋转,Activity重置
  16. P4128 [SHOI2006]有色图
  17. 教你如何有效防止DDos攻击?
  18. 关于Springboot中跨域问题的解决(Response to preflight request doesn‘t pass access control check)
  19. Chrome技巧-如何精准搜索
  20. 编写一个函数判断一个整数是不是素数c语言,编写函数判断一个整数是否为素数....

热门文章

  1. 会计有必要学python吗-工作三年却被实习生抢了饭碗,学会Python到底有多吃香?...
  2. 给python初学者的最好练手项目-Python的练手项目有哪些值得推荐?(知乎转载)...
  3. python详细安装教程linux-在Linux上安装Python3
  4. python能做表格吗-零基础小白怎么用Python做表格?
  5. python基础实例-Python入门基础知识实例,值得收藏!
  6. python简单代码编写-python读写Excel表格的实例代码(简单实用)
  7. python怎么学最快-python怎么快速自学?
  8. python条件语句-Python 条件语句
  9. 机器人编程语言python-5大机器人流行编程语言对比,你学会了哪种?
  10. python语言能干什么-Python这么火到底能干啥?