洛谷P1144 最短路计数

题目描述

给出一个 NN 个顶点 MM 条边的无向无权图,顶点编号为 1\sim N1∼N。问从顶点 11 开始,到其他每个点的最短路有几条。

输入格式

第一行包含 22 个正整数 N,MN,M,为图的顶点数与边数。

接下来 MM 行,每行 22 个正整数 x,yx,y,表示有一条由顶点 xx 连向顶点 yy 的边,请注意可能有自环与重边。

输出格式

共 NN 行,每行一个非负整数,第 ii 行输出从顶点 11 到顶点 ii 有多少条不同的最短路,由于答案有可能会很大,你只需要输出 ans \bmod 100003ansmod100003 后的结果即可。如果无法到达顶点 ii 则输出 00。

输入输出样例

输入 #1复制

5 7
1 2
1 3
2 4
3 4
2 3
4 5
4 5

输出 #1复制

1
1
1
2
4

说明/提示

11 到 55 的最短路有 44 条,分别为 22 条 1\to 2\to 4\to 51→2→4→5 和 22 条 1\to 3\to 4\to 51→3→4→5(由于 4\to 54→5 的边有 22 条)。

对于 20\%20% 的数据,1\le N \le 1001≤N≤100;
对于 60\%60% 的数据,1\le N \le 10^31≤N≤103;
对于 100\%100% 的数据,1\le N\le10^61≤N≤106,1\le M\le 2\times 10^61≤M≤2×106。

思路:由于是酷暑时期,头脑晕眩,一开始看到题目没有发现是无权的,在那里想了很久,最后知道无权后很明显一个bfs就是找最短路顺便还有条数,具体如下。但是还是交了很多遍才过,第一次是没有发现到无向图,第二次是没有发现到要mod100003,而还是再交了一次,由于第三次提交的时候又是有向图哈哈哈。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+5,mod=100003;
bool vis[maxn];
ll cnt[maxn]={0,1};
vector<int> edg[maxn];
int stp[maxn];//更新一次,后面就是判断用的,只有步数等于更新时候的步数才能加cnt 
void bfs()//可能有自环和重边 
{
	memset(stp,-1,sizeof stp);
	memset(vis,0,sizeof vis);
	stp[1]=0;
	queue<int> q;
	q.push(1);
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		for(auto v:edg[u])
		{
			if(stp[v]==-1||stp[v]==stp[u]+1)
			{
				stp[v]=stp[u]+1;
				cnt[v]=(cnt[v]+cnt[u])%mod;
				if(!vis[v])q.push(v);
				vis[v]=1;
			}
		}
	}
}
int main()
{
	ios_base::sync_with_stdio(false),cin.tie(nullptr);
	int n,m;
	cin>>n>>m;
	while(m--)
	{
		int u,v;
		cin>>u>>v;
		edg[u].push_back(v);
		edg[v].push_back(u);
	}
	bfs();
	for(int i=1;i<=n;i++)cout<<cnt[i]<<"\n";
	return 0;
}

<think>好的,我需要帮助用户查找P5587的题解或相关信息。首先,我应该确认用户提供的引用中是否有关于P5587的内容。用户提供的引用包括题解P1102、P8815、P1098、P1009,但没有提到P5587。因此,我需要基于现有信息推测可能的解题方向。 接下来,我想到的题目通常涉及算法和编程,可能需要高精度计算、二分查找、动态规划等。比如,引用[4]提到高精度理,引用[1]涉及二分查找,引用[2]讨论逻辑运算的短路特性。结合这些,P5587可能涉及类似算法。 另外,用户的问题可能需要具体的代码实现或数学公式。例如,如果题目涉及数学问题,可能需要使用LaTeX格式的公式,如$O(n \log n)$的间复杂度。同,根据用户提供的系统级指令,需要正确应用行内和独立公式的格式。 考虑到用户引用的题解中有高精度理和逻辑运算,P5587可能的考可能包括字符串理、递归或数学建模。例如,可能需要理大数运算(引用[4]),或者利用二分法优化查找(引用[1])。此外,引用[2]中的逻辑短路特性可能在某些件判断中发挥作用。 由于缺乏具体的题目描述,我无法确定确切的解法,但可以提供一般性的解题步骤:分析题目要求,确定算法理输入输出,注意件。例如,如果涉及数学公式,需正确推导并转换为代码。同,注意代码优化,如避免重复计算,使用高效数据结构等。 后,生成相关问题,需围绕可能的算法和题目类型展开,例如高精度应用、二分查找优化、动态规划策略等,帮助用户进一步探索可能的解题方向。</think>根据现有信息分析,P5587题目暂未在提供的引用资料中找到直接对应的题解,但可以通过常见算法思路进行推测。以下是可能适用的解题方向: --- ### **可能解题思路** 1. **输入理与数据结构** - 若题目涉及字符串解析(如引用[3]的字符理),需采用**状态机模式**逐字符分析 - 示例代码片段: ```cpp string s; vector<string> tokens; for (char c : s) { if (is_operator(c)) { // 判断是否为特殊符 tokens.push_back(string(1, c)); } } ``` 2. **数学公式推导** - 若题目涉及数列或几何问题,可能需要推导递推公式 $$a_n = a_{n-1} + k \cdot (n-1) \quad (k \text{为常数})$$ 3. **算法优化技巧** - 参考引用[1]的二分思想,结合循环优化间复杂度 例如:利用二分查找将$O(n^2)$优化至$O(n \log n)$ --- ### **关键代码段参考** 若题目与逻辑运算相关(参考引用[2]的短路特性): ```cpp bool evaluate_expression() { bool left = calculate_left_part(); // 先计算左半部分 if (left == true) return true; // 短路特性:左为真则无需计算右半部分 else return left || calculate_right_part(); } ``` --- ### **相关问题** 1. 如何理涉及高精度运算的字符串输入(参考引用[4]的低位存储法)? 2. 在逻辑表达式中如何利用短路特性优化计算顺序? 3. 如何通过二分查找降低嵌套循环的间复杂度? --- 如需更精确的分析,请提供题目具体描述或补充更多关联信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值