Dfs【p4306(bzoj 2208)】 [JSOI2010]连通数
2018-10-19 18:12
501 查看
Description
度量一个有向图恋情情况的一个指标是连通,指途中可达点对的个数。
下图的连通数是14
现在要你求出连通数
Input
输入数据第一行是图顶点的数量,一个正整数N。 接下来N行,每行N个字符。第i行第j列的1表示顶点i到j有边,0则表示无边。
Output
输出一行一个整数,表示该图的连通数。
难得看到省选出这种简单题,难道是为了考链式前向星?
直接建边对每个点跑\(dfs\),对于到达的点直接\(ans++\),(即此时形成了点对.
这题貌似不能直接回溯,需要\(memset\)
代码
#include<cstdio> #include<cstring> #define R register using namespace std; int head[200008],tot,ans,n; struct cod{int u,v;}edge[2200008]; char s[200008]; bool vis[200008]; inline void add(int x,int y) { edge[++tot].u=head[x]; edge[tot].v=y; head[x]=tot; } void dfs(int u) { if(vis[u])return; ans++;vis[u]=true; for(R int i=head[u];i;i=edge[i].u) { if(!vis[edge[i].v]) dfs(edge[i].v); } } int main() { scanf("%d",&n); for(R int i=1;i<=n;i++) { scanf("%s",s+1); for(R int j=1;j<=n;j++) if(s[j]=='1')add(i,j); } for(R int i=1;i<=n;i++) { memset(vis,0,sizeof vis); dfs(i); } printf("%d",ans); }
相关文章推荐
- BZOJ 2208: [Jsoi2010]连通数( DFS )
- 【BZOJ2208】[Jsoi2010]连通数 DFS
- 【BZOJ2208】[Jsoi2010]连通数【BFS/DFS】【SCC】
- [BZOJ2208][Jsoi2010]连通数(dfs||tarjan+拓扑序+dp)
- 【bzoj 2208】[Jsoi2010]连通数(dfs||Tarjan算法+拓扑序+dp)
- bzoj 2208: [Jsoi2010]连通数 (dfs|tarjan+bitset+拓扑序)
- 【强联通分量缩点】【搜索】bzoj2208 [Jsoi2010]连通数
- BZOJ 2208: [Jsoi2010]连通数 tarjan bitset
- [tarjan+bitset]BZOJ 2208——[Jsoi2010]连通数
- bzoj 2208 [Jsoi2010]连通数 bitset
- [bzoj2208][Jsoi2010]连通数
- BZOJ_2208_[Jsoi2010]连通数_强连通分量+拓扑排序+手写bitset
- 【BZOJ2208】【JSOI2010】连通数 传递闭包
- 【bzoj2208】[Jsoi2010]连通数
- BZOJ 2208 [Jsoi2010]连通数 tarjan缩点+bitset优化DP
- [bzoj2208][Jsoi2010]连通数_bitset_传递闭包floyd
- bzoj2208 [Jsoi2010]连通数(tarjan缩点+拓扑排序+bitset传递闭包)
- bzoj 2208: [Jsoi2010]连通数
- BZOJ2208 [JSOI2010] 连通数
- BZOJ 2208 [Jsoi2010]连通数