不难的一道题,就是码的时候出了点问题,看了其他巨佬的题解才发现问题所在...

题目大意:

给定一个有向图,n个点,m条边。请问,1号点到2号点有多少条路径?如果有无限多条,输出inf,如果有限,输出答案模1e9的余数。

首先是0的情况:

  不存在1~2的路径,即图不一定联通(不这样特判也可以,但是常数会小一点)

其次是inf的情况:

  如果在1~2的某条路径中存在某个点属于某个强连通分量,那么这条路径就可以在这个强连通分量里无限走下去,答案就是inf

一般情况:

  如果这条路径不属于第二种情况,那就考虑计数吧...

  我们可以用一个dp数组计数,然后乱搞BFS即可,不用考虑是否vis,因为排除了第二种情况后显然是不会过度访问(RE)的

  同时我们可以记录每一个节点的入度个数,在最后BFS,DP的时候,根据入度可以减少判断很多情况

同时:一个小问题:在考虑情况2的时候,我们需要建立反向边,以便判断1,2可达性(刚开始想当然了这个没判)

 #pragma GCC optimize("Ofast")
#pragma GCC optimize(3)
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#define ha 1000000000
using namespace std;
inline int read(){
int ans=,f=;char chr=getchar();
while(!isdigit(chr)){if(chr=='-') f=-;chr=getchar();}
while(isdigit(chr)){ans=(ans<<)+(ans<<)+chr-;chr=getchar();}
return ans*f;
}void write(int x){
if(x<) putchar('-'),x=-x;
if(x>) write(x/);
putchar(x%+'');
}const int M=1e5+;
int head[M],head1[M],ver1[M],nxt1[M],ver[M],nxt[M],tot,n,m,vis1[M],vis2[M],dfn[M],low[M],ins[M],sta[M],top,t,col,color[M],cnt[M],tot1,dp[M],in[M];
inline void add(int x,int y){ver[++tot]=y;nxt[tot]=head[x];head[x]=tot;}
inline void add1(int x,int y){ver1[++tot1]=y;nxt1[tot1]=head1[x];head1[x]=tot1;}
void dfs1(int x){for(int i=head[x];i;i=nxt[i])if(in[ver[i]]++,!vis1[ver[i]])dfs1(ver[vis1[ver[i]]=,i]);}
void dfs2(int x){for(int i=head1[x];i;i=nxt1[i])if(!vis2[ver1[i]])dfs2(ver1[vis2[ver1[i]]=,i]);}
inline bool check_LT(){vis2[]=,dfs2();if(vis1[vis1[]=,dfs1(),]) return ;return ;}
void Tarjan(int x){
sta[top++]=x;low[x]=dfn[x]=++t;ins[x]=;
for(register int i=head[x];i;i=nxt[i])
if(ins[ver[i]]==) low[x]=min(low[x],dfn[ver[i]]);
else if(ins[ver[i]]==) low[x]=min(low[Tarjan(ver[i]),x],low[ver[i]]);
low[x]==dfn[x]?++col:col;
if(low[x]==dfn[x])do{--top,color[sta[top]]=col,ins[sta[top]]=-,++cnt[col];}while(sta[top]!=x);
}queue<int> q;
void BFS(){
q.push();dp[]=;
while(!q.empty()){
int x=q.front();q.pop();
for(register int i=head[x];i;i=nxt[i]){
if(!vis1[ver[i]]) continue;
dp[ver[i]]=(dp[ver[i]]+dp[x])%ha;
if(!--in[ver[i]]) q.push(ver[i]);
}
}
}
int main(){
n=read(),m=read();
for(register int i=,x,y;i<=m;++i) x=read(),y=read(),add(x,y),add1(y,x);
if(check_LT()){return puts(""),;}
for(register int i=;i<=n;++i) if(!dfn[i]) Tarjan(i);
for(register int i=;i<=n;++i)
if(vis1[i]&&vis2[i]&&cnt[color[i]]>=)
return puts("inf"),;
return BFS(),write(dp[]),;
}

[COCI2006-2007 Contest#3] BICIKLI的更多相关文章

  1. 洛谷P4645 [COCI2006-2007 Contest#7] BICIKLI [Tarjan,拓扑排序]

    题目传送门 BICIKLI 题意翻译 给定一个有向图,n个点,m条边.请问,1号点到2号点有多少条路径?如果有无限多条,输出inf,如果有限,输出答案模10^9的余数. 两点之间可能有重边,需要看成是 ...

  2. P4645 [COCI2006-2007 Contest#3] BICIKLI

    题意翻译 给定一个有向图,n个点,m条边.请问,1号点到2号点有多少条路径?如果有无限多条,输出inf,如果有限,输出答案模10^9的余数. 两点之间可能有重边,需要看成是不同的路径. 题目描述 A ...

  3. IOCCC(The International Obfuscated C Code Contest)

    国际 C 语言混乱代码大赛(IOCCC, The International Obfuscated C Code Contest)是一项国际编程赛事,从 1984 年开始,每年举办一次(1997年.1 ...

  4. poi读取excel模板,填充内容并导出,支持导出2007支持公式自动计算

    /** * 版权所有(C) 2016 * @author www.xiongge.club * @date 2016-12-7 上午10:03:29 */ package xlsx; /** * @C ...

  5. Programming Contest Problem Types

        Programming Contest Problem Types Hal Burch conducted an analysis over spring break of 1999 and ...

  6. BZOJ 2007: [Noi2010]海拔

    2007: [Noi2010]海拔 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2410  Solved: 1142[Submit][Status] ...

  7. hdu 4946 2014 Multi-University Training Contest 8

    Area of Mushroom Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  8. 2016 Multi-University Training Contest 2 D. Differencia

    Differencia Time Limit: 10000/10000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Tot ...

  9. 2016 Multi-University Training Contest 1 G. Rigid Frameworks

    Rigid Frameworks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

随机推荐

  1. [luoguP1058] 立体图(超级大模拟(¬︿̫̿¬☆))

    传送门 看到题后整个人成了mengbier 但是仔细分析一下就很简单了,先确定好输出的图的长和宽. 然后从输入的矩形的左上角的最下面的开始填充,顺序是从下到上,从左到右,从后往前. 填充的时候直接覆盖 ...

  2. [K/3Cloud] 关于单据转换的问题

    1. 单据转换,是否支持重复下推,支持新增下推和更新下推? 答:支持重复下推,是否允许下推受以下因素: 1).源分录是否是有效状态(源单单头状态会自动影响分录,下同),例如已审核.未关闭.未作废: 2 ...

  3. 【ZJOI2017 Round1练习】D8T2 sequence(DP)

    题意: 思路: #include <algorithm> #include <iostream> #include <cstring> #include <c ...

  4. onclick方法和$("").click()有不一样的地方

    话说是这样的...昨天写了一个文件上传的功能,是这样的,用fastdfs上传成功后会有一个url... 然后我自己测试上传,包括在文件服务器里都能找到.. 然后就自己打包发版了,都很正常也没报错... ...

  5. 转载:C/C++检测内存泄漏的工具 vld Visual Leak Detector223 的使用方法和sample示例

    这类的工具有 比如 :LeakDiag leakfinder "Visual Leak Detector" vld可以从http://vld.codeplex.com/releas ...

  6. vagrant的学习 之 ThinkPHP5.1

    vagrant的学习 之 ThinkPHP5.1 本文根据慕课网的视频教程练习,感谢慕课网! 慕课视频学习地址:https://www.imooc.com/video/14218. 慕课的参考文档地址 ...

  7. CSU - 1115 最短的名字(字典树模板题)

    Description 在一个奇怪的村子中,很多人的名字都很长,比如aaaaa, bbb and abababab. 名字这么长,叫全名显然起来很不方便.所以村民之间一般只叫名字的前缀.比如叫'aaa ...

  8. 1sting 大数 递推

    You will be given a string which only contains ‘1’; You can merge two adjacent ‘1’ to be ‘2’, or lea ...

  9. [bzoj2527][Poi2011]Meteors_整体二分_树状数组

    Meteors bzoj-2527 Poi-2011 题目大意:题目链接. 注释:略. 想法: 首先答案可以离线,且具有单调性. 这里的单调性就是随着时间的推移,每个国家收集的陨石数增加. 不难想到整 ...

  10. ACM组队安排-——杭电校赛(递推)

    #include<stdio.h> #include<string.h> #include<math.h> #include<stdlib.h> #in ...