首页 > 其他分享 >AT_abc211_d [ABC211D] Number of Shortest paths 题解

AT_abc211_d [ABC211D] Number of Shortest paths 题解

时间:2024-04-17 23:01:41浏览次数:31  
标签:paths abc211 int 题解 短路 cnt vis push dis

题目简述

给定一张 $n$ 个点 $m$ 条边的无向无权图,问从 $1$ 到 $n$ 的最短路有多少条。

题目分析

设 $cnt_i$ 表示从 $1$ 到 $i$ 的最短路条数,$dis_i$ 表示最短路。

这道题可以考虑使用 BFS 做,对于一个点 $v$,设第一次更新它的点为 $u$,则它的转移应为 $cnt_v \leftarrow cnt_u$ 并且 $dis_v \leftarrow dis_u+1$,表示 $v$ 的最短路是由 $u$ 转移过来的。由于 BFS 的算法流程,此时 $v$ 的最短路已经被确定下来了,所以之后再有点 $x$ 更新 $v$ 时,仅当 $dis_v=dis_x+1$ 时,才有转移 $cnt_v \leftarrow cnt_v+cnt_x$,表示 $1 \rightarrow x \rightarrow v$ 是 $1 \rightarrow v$ 的另一条最短路。

最后输出 $cnt_n$ 即可。

代码

#include<bits/stdc++.h>
using namespace std;
#define random(a,b) (rand()%(b-a+1)+a)
const int N=2e5+10,mod=1e9+7;
int n,m,x,y,dis[N],cnt[N],vis[N];
vector<int> G[N]; 
queue<int> q;
int main()
{
	ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>m;
    for(int i=1;i<=m;i++)
    {
    	cin>>x>>y;
    	G[x].push_back(y);
    	G[y].push_back(x);
	}
	memset(dis,0x3f,sizeof dis);
	dis[1]=0;
	cnt[1]=1;
	q.push(1);
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		vis[u]=1;
		for(int v:G[u])
		{
			if(!vis[v])
			{
				dis[v]=dis[u]+1;
				cnt[v]+=cnt[u];
				q.push(v);
				vis[v]=1;
			}
			else if(dis[u]+1==dis[v])
			{
				cnt[v]=(cnt[v]+cnt[u])%mod;
			}
		}
	}
	cout<<cnt[n];
	return 0;
}

标签:paths,abc211,int,题解,短路,cnt,vis,push,dis
From: https://www.cnblogs.com/zhuluoan/p/18142008

相关文章

  • CF81C Average Score 题解
    题目简述给定一个长度为$n$的序列,在其中取出$x$个数,构成一个数列$a$,剩下的$y$个数构成数列$b$。若第$i$个数在数列$a$中,$ans_i$等于$1$,否则等于$2$,请你给出一种方案使得两数列的平均数之和最大且$ans$的字典序最小.题目分析我们先考虑$x=y$的情况,在这种情......
  • ICPC2023杭州站题解(B D E F G H J M)
    本场金牌数量较其他场多(45枚),但金牌线题数不多。五题为分水岭,五道简单题过后所有题均为金牌题,其中有四道可做,即ABEF,做出任意一道即可拿金牌。这里提供除A题以外的所有可做题的题解。ICPC2023杭州站:M:加入比当前选择的所有数大的数一定会让平均值上升,因此答案数列中,V图中的......
  • [题解][洛谷P1136] 迎接仪式
    题目描述对于一个由字母“j”和“z”组成的字符串,可以任意交换两个字符的位置不超过k次,求最多能出现多少个“jz”字串。题解动态规划题。设f[i][j][k][0/1]表示到第i位,前面交换了j个“j”,交换了k个“z”,且第i位是j(用0表示)或z(用1表示)。当j=k时即为可行解。为什么需要用第四维......
  • [题解][洛谷P1108] 低价购买
    题目描述求最长下降子序列长度,以及最长下降子序列的个数。(构成的序列一样的时候,视为同一种最长下降子序列)题解n不超过5000,n^2复杂度即可解决该问题。主要在于如何统计最长下降子序列个数。可以设数组t[i]表示以i为结尾的最长下降子序列个数,在更新f[i]的时候顺便更新。t[i]=......
  • [ABC229E] Graph Destruction 题解
    [ABC229E]GraphDestruction题解思路解析题目要求删点,而众所周知删点的代价要大于加点的代价,于是我们考虑倒着处理询问,将每一个删点改成加点,而加点时就用并查集维护连通块即可。code#include<bits/stdc++.h>usingnamespacestd;constintN=2e5+10;intn,m,fa[N];......
  • P10342 [THUSC 2019] 数列 题解
    形式化题面:求\[\sum_{l=1}^{n}\sum_{r=l}^{n}\max_{i=l}^{r}(i-l+1)\timesf(i,r)\]其中\(f(l,r)\)为\(a_l,...,a_r\)中有多少个不同的数字。注意到,除了Sub2,其余数据点都有\(\maxf\le800\),这启发我们考虑\(O(nm)\)的算法。套路地,扫描线枚举右端点,则现在只需要考虑......
  • [ABC212E] Safety Journey 题解
    [ABC212E]SafetyJourney题解思路解析首先根据题目的条件我们可以想到dp,用\(f_{i,j}\)表示走了\(i\)步,现在在\(j\)的方案数,可见转移即是\(f_{i,u}\gets\sum{f_{i-1,v}}\),这里的\(v\)表示每个与\(u\)相连的点。可见如此做时间复杂度为\(O(kn(\frac{n(n-1)}{2}-m......
  • ICPC2023南京站题解(A C D F G I L M)
    本场金牌线为7题前一半。做出8题可稳金牌,这里是难度前8题的题解。ICPC2023南京站I:签到题。#include<bits/stdc++.h>#definelllonglong#defineQWQcout<<"QwQ"<<endl;#defineFOR()llle=e[u].size();for(lli=0;i<le;i++)usingnamespacestd;constllN=501010;......
  • [ABC208D] Shortest Path Queries 2 题解
    [ABC208D]ShortestPathQueries2题解思路解析此题的本质其实就是Floyd。我们在进行Floyd时会有一个\(k\)充当中间点,可见这里的\(k\)就等于题目当中的\(k\),因为小于等于\(k\)的所有点都被当作过中间点转移过,而大于\(k\)的所有点都没有被当作过中间点转移过,于是直......
  • ABC211 复盘
    ABC211复盘[ABC211C]chokudai思路解析题目说的很明白,看到匹配子序列可以轻易想到是简单dp,直接做即可。时间复杂度:两个字符串两层循环,\(O(8\timesN)\)。code#include<bits/stdc++.h>usingnamespacestd;constintN=1e5+10;constlonglongmod=1e9+7;stri......