博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[BZOJ2208][Jsoi2010]连通数 暴力枚举
阅读量:5008 次
发布时间:2019-06-12

本文共 1363 字,大约阅读时间需要 4 分钟。

 

Description

Input

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

Output

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

Sample Input

010 
001 
100

Sample Output

9

HINT

 

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

 

Source

Solution

好好的暴力不写去写什么算法

虽然我也是学算法学傻了的,前两天看到一道题说这不是莫队裸题吗,然后其实前缀和就行了

做法1:$tarjan$缩点+拓扑

做法2:$floyd$传递闭包

做法3:暴力$dfs$

因为我这人比较菜所以就写做法3了

对于每个点直接开一个$vis$数组判断有没有到达过就可以了

比tarjan短多了

#include 
using namespace std ;#define N 2010#define ll long long int n , head[ N ] , cnt , vis[ N ] ; struct node { int to , nxt ;}e[ N * N ] ;void ins( int u , int v ) { e[ ++ cnt ].to = v ; e[ cnt ].nxt = head[ u ] ; head[ u ] = cnt ; }ll find( int u ) { ll ans = 1 ; vis[ u ] = 1 ; for( int i = head[ u ] ; i ; i = e[ i ].nxt ) { if( vis[ e[ i ].to ] ) continue ; ans += find( e[ i ].to ) ; } return ans ;}int main() { scanf( "%d" , &n ) ; for( int i = 1 ; i <= n ; i ++ ) { char ch[ 2010 ] ; scanf( "%s" , ch + 1 ) ; for( int j = 1 ; j <= n ; j ++ ) { if( ch[ j ] == '1' ) { ins( i , j ) ; } } } ll ans = 0 ; for( int i = 1 ; i <= n ; i ++ ) { memset( vis , 0 ,sizeof( vis ) ) ; ans += find( i ) ;// printf( "Case #%d : %d\n" , i , ans - t ) ; } printf( "%lld\n" , ans ) ; return 0 ;}

 

转载于:https://www.cnblogs.com/henry-1202/p/BZOJ2208.html

你可能感兴趣的文章
Codeforces Round #344 (Div. 2) Messager KMP的应用
查看>>
20145308刘昊阳 《Java程序设计》第4周学习总结
查看>>
js倒计时
查看>>
EasyUI datagrid 格式 二
查看>>
Android虹软人脸识别sdk使用工具类
查看>>
UI:基础
查看>>
浅谈 @RequestParam 和@PathVariable
查看>>
设计模式之---装饰器设计模式
查看>>
基于WordNet的英文同义词、近义词相似度评估及代码实现
查看>>
Equation漏洞混淆利用分析总结(上)
查看>>
shell学习1shell简介
查看>>
Qt 【无法打开 xxxx头文件】
查看>>
JAVA项目将 Oracle 转 MySQL 数据库转换(Hibernate 持久层)
查看>>
三层架构(我的理解及详细分析)
查看>>
Django模板语言相关内容
查看>>
前端开发工程师如何在2013年里提升自己【转】--2016已更新升级很多何去何从?...
查看>>
markdown语法测试集合
查看>>
running and coding
查看>>
实现QQ第三方登录、网站接入
查看>>
HTML CSS 层叠样式表 三
查看>>