首页 > 其他分享 >P4645 [COCI2006-2007#3] BICIKLI

P4645 [COCI2006-2007#3] BICIKLI

时间:2023-07-09 09:34:38浏览次数:45  
标签:ch COCI2006 路径 BICIKLI 2007 ans ll 号点 SIZE

P4645 [COCI2006-2007#3] BICIKLI

题意:求一张 \(n\) 个点的有向图中 \(1\) 号点到 \(2\) 号点的路径数。

首先考虑不在 \(1\) 号点到 \(2\) 号点的路径上的那些点不会对答案产生影响,于是先预处理出所有 \(1\) 号点到 \(2\) 号点路径上经过的点。先在原图上以 \(1\) 号点为起点对所有能到达的点进行染色,再在反图上以 \(2\) 号点为起点对所有能到达的点进行染色。两次都被染上色的点就在 \(1\) 号点到 \(2\) 号点的路径上。

然后考虑什么时候会有无数条满足条件的路径。发现当且仅当路径上有环时,可以经过任意次环以产生无数条路径。

剩下的情况就是 \(\text{DAG}\) 了,直接跑拓扑用 \(\text{dp}\) 进行路径计数。

复杂度 \(O(n + m)\)

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll SIZE = 200005;
const ll mod = 1e9;
ll n, m;
ll head[SIZE], ver[SIZE*2], nxt[SIZE*2], tot;
vector<ll> e[SIZE];
bool c1[SIZE], c[SIZE];
ll d[SIZE];
ll ans[SIZE];

inline ll rd(){
	ll f = 1, x = 0;
	char ch = getchar();
	while(ch < '0' || ch > '9'){
		if(ch == '-') f = -1;
		ch = getchar();
	}
	while(ch >= '0' && ch <= '9'){
		x = (x << 1) + (x << 3) + (ch ^ 48);
		ch = getchar();
	}
	return f*x;
}

void add(ll x, ll y){
	ver[++tot] = y, nxt[tot] = head[x];
	head[x] = tot;	
}

void dfs1(ll x){
	c1[x] = 1;
	for(int i = head[x]; i; i = nxt[i]){
		ll y = ver[i];
		if(c1[y]) continue;
		dfs1(y);
	}	
}

void dfs2(ll x){
	c[x] = 1;
	for(int i = 0; i < e[x].size(); i++){
		ll y = e[x][i];
		if(c[y]) continue;
		dfs2(y);
	}
}

struct E{
	ll x, y;
}ee[SIZE];

int main(){
	n = rd(), m = rd();
	assert(n <= 100000 && m <= 100000);
	for(int i = 1; i <= m; i++){
		ll x = rd(), y = rd(); ee[i].x = x, ee[i].y = y;
		add(x, y); e[y].push_back(x);
	}
	dfs1(1);
	dfs2(2);
	ll cnt = 0;
	for(int i = 1; i <= n; i++) c[i] &= c1[i], cnt += c[i];
	for(int i = 1; i <= m; i++){
		if(!c[ee[i].x] || !c[ee[i].y]) continue;
		d[ee[i].y]++; 
	}
	if(d[1] != 0){
		printf("inf");
		return 0;
	} 
	queue<int> q;
	q.push(1); ll z = 0;
	ans[1] = 1;
	while(q.size()){
		ll x = q.front(); q.pop();
		z++;
		for(int i = head[x]; i; i = nxt[i]){
			ll y = ver[i];
			d[y]--; ans[y] = (ans[y] + ans[x]) % mod;
			if(d[y] == 0){
				q.push(y);
			}
		}
	}
	if(z < cnt) printf("inf");
	else printf("%lld", ans[2]);
	return 0;
}

标签:ch,COCI2006,路径,BICIKLI,2007,ans,ll,号点,SIZE
From: https://www.cnblogs.com/Semorius/p/17538325.html

相关文章

  • 【题解】 [APIO2007] 动物园
    目录题目链接原题描述题目描述输入格式输出格式样例#1样例输入#1样例输出#1样例#2样例输入#2样例输出#2提示题意概括思路历程1.与环相关2.设计状态代码实现题目链接原题描述[APIO2007]动物园题目描述新建的圆形动物园是亚太地区的骄傲。圆形动物园坐落于太平洋的一个......
  • cad2024破解-丨cad2024破解2007-2024下载 破解版分享
    autocad2021免费中文版是一款很非常简单且实用的工程制图类软件,可以帮助用户对工程用户进行非常简单的作画,让用户对不同格式下的能进行完美的诠释,更好的实现效果。[下载地址]:后台私信我autocad2021免费中文版简介1、扩展在遇到无法完成的操作时,可以直接通过对插件的安装达成不一样......
  • P4414 [COCI2006-2007#2] ABC
    [COCI2006-2007#2]ABC题面翻译【题目描述】三个整数分别为$A,B,C$。这三个数字不会按照这样的顺序给你,但它们始终满足条件:$A<B<C$。为了看起来更加简洁明了,我们希望你可以按照给定的顺序重新排列它们。【输入格式】第一行包含三个正整数$A,B,C$,不一定是按这个顺序。这......
  • [TJOI2007]路标设置 题解
    题目链接:https://www.luogu.com.cn/problem/P3853题目大意:给出一个递增数组,插入K个值,使其差分数列的最大值最小;值得注意的是,此题中每个数字都是整数考点:整数二分错误思路:利用堆排,取最大值直接二分code:1#include<bits/stdc++.h>23usingnamespacestd;45int......
  • 基于栅格的分布式新安江模型构建与分析 - 姚成 - 2007
    摘要:基于DEM的分布式水文模型是现代水文学同计算机,3S等高科技技术相结合的产物,是水文模型新的发展方向.本文是在数字高程模型的基础上,研究和归纳了流域信息提取的方法和算法,利用DEM数据提取了河网,水系,水流路径等相关的流域特征,并根据三水源新安江模型的理论,建立了一个基......
  • 在access 2007 中进行sql query
    1.发现了两个小工具(都是通过odbc来访问)1.1winsql(其中lite是免费版,需要上网站上申请注册号)1.2querytool2.CreatingaSQLQueryinAccess2007byrhyttinenonSeptember17,2008SQL(StructuredQueryLanguage)isapowerfuldatabaselanguageusedinqueries......
  • BL102采集DL/T645-2007规约电表说明
    本文主要讲述了钡铼技术BL102物联网网关如何通过RS485采集DL/T645规约电表BL102是一款采集西门子、三菱、欧姆龙、台达、AB、施耐德等各种PLC数据转换为ModbusTCP、OPCUA、MQTT、ThingsBoard等协议的工业物联网网关。BL102下行支持:西门子、三菱、欧姆龙、台达、AB、施耐德等各种P......
  • [JSOI2007]建筑抢修
    [JSOI2007]建筑抢修跟经典题poj1456非常像。首先如果两个都被选入那么截至时间T2小的放前面肯定更优,所以我们先按T2排序。然后逐个遍历建筑,建立一个维修时间为关键字的大根堆,如果前面花费的总时间+维修的时间小于当前的T2,直接加入。否则判断是否小于堆顶,如果小于堆顶则替换,因为......
  • 算法学习记录(模拟枚举贪心题单):[NOIP2007]字符串的展开(未AC,明天找bug)
    题目链接https://ac.nowcoder.com/acm/contest/20960/1001解题思路很简单的模拟题,以后写模拟要先分两大类,元素在某个集合中存不存在的问题,再细分。未AC代码#include<iostream>#include<string>usingnamespacestd;//碰到'-'的展开条件:// 1.减号两侧同为小写字母......
  • Windows 2007卸载mysql数据库
    文档课题:Windows2007卸载mysql数据库.系统:windows2007专业版数据库:mysql5.5.621、关闭服务--在service服务中关闭MySQL服务,如下所示:2、卸载MySQL服务--在控制面板删除MySQL程序.3、删除相关文件夹--删除mysql在电脑硬盘上所有文件,位置C:\ProgramFiles\MySQL.--删除C:\Pro......