[COCI2006-2007 Contest#3] BICIKLI
不难的一道题,就是码的时候出了点问题,看了其他巨佬的题解才发现问题所在...
题目大意:
给定一个有向图,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的更多相关文章
- 洛谷P4645 [COCI2006-2007 Contest#7] BICIKLI [Tarjan,拓扑排序]
题目传送门 BICIKLI 题意翻译 给定一个有向图,n个点,m条边.请问,1号点到2号点有多少条路径?如果有无限多条,输出inf,如果有限,输出答案模10^9的余数. 两点之间可能有重边,需要看成是 ...
- P4645 [COCI2006-2007 Contest#3] BICIKLI
题意翻译 给定一个有向图,n个点,m条边.请问,1号点到2号点有多少条路径?如果有无限多条,输出inf,如果有限,输出答案模10^9的余数. 两点之间可能有重边,需要看成是不同的路径. 题目描述 A ...
- IOCCC(The International Obfuscated C Code Contest)
国际 C 语言混乱代码大赛(IOCCC, The International Obfuscated C Code Contest)是一项国际编程赛事,从 1984 年开始,每年举办一次(1997年.1 ...
- poi读取excel模板,填充内容并导出,支持导出2007支持公式自动计算
/** * 版权所有(C) 2016 * @author www.xiongge.club * @date 2016-12-7 上午10:03:29 */ package xlsx; /** * @C ...
- Programming Contest Problem Types
Programming Contest Problem Types Hal Burch conducted an analysis over spring break of 1999 and ...
- BZOJ 2007: [Noi2010]海拔
2007: [Noi2010]海拔 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2410 Solved: 1142[Submit][Status] ...
- 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) ...
- 2016 Multi-University Training Contest 2 D. Differencia
Differencia Time Limit: 10000/10000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...
- 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) ...
随机推荐
- hihoCoder#1051 补提交卡
原题地址 简单贪心 首先,补提交卡应该连续使用,其次,补提交卡应该全部用掉(如果补提交卡多于未提交天数则额外处理) 所以,依次遍历未提交日期,计算:从当前位置开始,用M张补提交卡覆盖后面连续M个数字, ...
- [luoguP2957] [USACO09OCT]谷仓里的回声Barn Echoes(Hash)
传送门 团队里的hash水题,数据小的不用hash都能过.. 也就是前缀hash,后缀hash,再比较一下就行. ——代码 #include <cstdio> #include <c ...
- Eclipse配置SVN的几种方法及使用详情
此文章对Myeclipse同样适用. 一.在Eclipse里下载Subclipse插件 方法一:从Eclipse Marketplace里面下载 具体操作:打开Eclipse --> Help ...
- [bzoj4281][ONTAK2015]Związek Harcerstwa Bajtockiego_倍增LCA
Związek Harcerstwa Bajtockiego bzoj-4281 ONTAK-2015 题目大意:给定一棵有n个点的无根树,相邻的点之间的距离为1,一开始你位于m点.之后你将依次收到k ...
- Ubuntu 16.04中iptables的工具简介(iptables/iptables-restore/iptables-xml/iptables-apply/iptables-save)
Ubuntu 16.04中安装的iptables版本为1.6.0,官方参考:http://www.linuxfromscratch.org/blfs/view/cvs/postlfs/iptables ...
- JSP的表单处理
以下内容引用自http://wiki.jikexueyuan.com/project/jsp/form-processing.html: 当需要从浏览器向Web服务器传递一些信息并最终将信息返回到后端 ...
- golang 中可变参数的个数
package main import "fmt" func Greeting(prefix string, who ... string) { fmt.Println(prefi ...
- win7 多用户远程登录
win7多用户远程登录 远程桌面服务使局域网(LAN)上的计算机可以连接到服务器(也称为远程计算机)并运行位于服务器上的程序.这可以只需要在1台机器上安装应用程序,其他机器共享使用.远程桌面连接使用远 ...
- cisco PIX
来自为知笔记(Wiz)
- C#.NET如何将cs文件编译成dll文件 exe文件 如何调用dll文件
比如我要把TestDLL.cs文件编译成dll文件,则在命令提示符下,输入下面的命令,生成的文件为TestDLL.dll csc /target:library TestDLL.cs 注意前提是你安装 ...