洛谷P1144 最短路计数 及其引申思考
图论题目练得比较少,发一道spfa的板子题目~
题目:P1144
题目描述
给出一个N个顶点M条边的无向无权图,顶点编号为1~N。问从顶点1开始,到其他每个点的最短路有几条。
输入输出格式
输入格式:
输入第一行包含2个正整数N,M,为图的顶点数与边数。
接下来M行,每行两个正整数x, y,表示有一条顶点x连向顶点y的边,请注意可能有自环与重边。
输出格式:
输出包括N行,每行一个非负整数,第i行输出从顶点1到顶点i有多少条不同的最短路,由于答案有可能会很大,你只需要输出mod 100003后的结果即可。如果无法到达顶点i则输出0。
输入输出样例
5 7
1 2
1 3
2 4
3 4
2 3
4 5
4 5
1
1
1
2
4
说明
1到5的最短路有4条,分别为2条1-2-4-5和2条1-3-4-5(由于4-5的边有2条)。
对于20%的数据,N ≤ 100;
对于60%的数据,N ≤ 1000;
对于100%的数据,N<=1000000,M<=2000000。
Solution:
一眼数据范围,吓得就是一滚~,关键是还有重边,而且spfa只能记录单点到其它点的一条最短路,这题又要输出最短路个数取模,让人琢磨不透。So,默默的看看标签吧,普及+提高,嗯貌似不是很难,看下解题标签:spfa,bfs,图论,最短路。OK,果然还是要用到spfa,我们关键是要想到如何去处理重边和最短路计数。于是乎,我们先写一下spfa的模板,然后再来思考,不难发现:边权都为1,对于重边在spfa中会进行多次才到下一个点,所以路径数会记录下来,而且在spfa的松弛操作中由于边权均为1所以每个点只会松弛一次,于是乎在跑spfa时我们只需判断dis[v]==dis[u]+1是否成立,若成立,对于ans就加上到u点的边的条数再取模。这样这道题就完美的解决了。
代码:
#include<bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
#define ll long long
#define il inline
#define mod 100003
#define N 1000005
#define inf 233333333
int n,m,h[N],dis[N],cnt,ans[N];
bool vis[N];
queue<int>q;
il int gi()
{
int a=;char x=getchar();bool f=;
while((x<''||x>'')&&x!='-')x=getchar();
if(x=='-')x=getchar(),f=;
while(x>=''&&x<='')a=a*+x-,x=getchar();
return f?-a:a;
}
struct edge{
int to,net;
}e[N<<];
il void add(int u,int v){e[++cnt].to=v;e[cnt].net=h[u];h[u]=cnt;}
il void spfa(int s)
{
for(int i=;i<=n;i++)dis[i]=inf;
q.push(s);
vis[s]=;ans[s]=;dis[s]=;
int u,v;
while(!q.empty())
{
u=q.front();
q.pop();vis[u]=;
for(int i=h[u];i;i=e[i].net){
v=e[i].to;
if(dis[u]+<dis[v]){
dis[v]=dis[u]+;
ans[v]=ans[u];
if(!vis[v])vis[v]=,q.push(v);
}
else if(dis[v]==dis[u]+)ans[v]=(ans[v]+ans[u])%mod;
}
}
}
int main()
{
n=gi(),m=gi();
int u,v;
for(int i=;i<=m;i++)
{
u=gi(),v=gi();
add(u,v);add(v,u);
}
spfa();
for(int i=;i<=n;i++)printf("%d\n",ans[i]);
return ;
}
思考:
由这道题我们想到,如果对与任意一个有向无环且带权的图,需要输出规定原点到其它点的最短路径条数,这样应该怎么去做呢?
我们可以先跑一遍spfa,再进行DAG+DP(或者记忆化搜索),也可以直接两遍spfa跑过(YZK大佬告诉我的方法,仔细想想思路都差不多,原理还是DP),于是乎,论DP的重要性,当然也可以看出spfa的应用有多广泛。。。
推广题:POJ3463(解题报告)
洛谷P1144 最短路计数 及其引申思考的更多相关文章
- 洛谷P1144 最短路计数(SPFA)
To 洛谷.1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M ...
- 洛谷 P1144 最短路计数 解题报告
P1144 最短路计数 题目描述 给出一个\(N\)个顶点\(M\)条边的无向无权图,顶点编号为\(1-N\).问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 第一行包含2个正 ...
- 洛谷——P1144 最短路计数
P1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M,为图的顶 ...
- 洛谷 P1144 最短路计数 题解
P1144 最短路计数 题目描述 给出一个\(N\)个顶点\(M\)条边的无向无权图,顶点编号为\(1-N\).问从顶点\(1\)开始,到其他每个点的最短路有几条. 输入格式 第一行包含\(2\)个正 ...
- 洛谷P1144最短路计数题解
最短路计数 此题还是寻找从1到i点总共有几个最短路且每条边的边长为1,对于这种寻找最短路的个数,我们可以反向搜索,即先用\(SPFA\)预处理出所有点的最短路,然后我们反向记忆化搜索,可以用\(sum ...
- 洛谷 P1144 最短路计数
传送门:https://www.luogu.org/problemnew/show/P1144 这虽然是一道普及+的题,然而我发现我现在还没做过,这也就直接导致我今天模拟T2只杠了个暴力分…… 那这道 ...
- 洛谷P1144——最短路计数
题目:https://www.luogu.org/problemnew/show/P1144 spfa跑最短路的同时记录cnt数组表示到达方案数. 代码如下: #include<iostream ...
- 洛谷P1144 最短路计数【堆优化dijkstra】
题目:https://www.luogu.org/problemnew/show/P1144 题意:问1到各个节点的最短路有多少条. 思路:如果松弛的时候发现是相等的,说明可以经过该点的最短路径到达当 ...
- 洛谷 P1144 最短路计数 Label:水
题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M,为图的顶点数与边数. 接下来M行 ...
随机推荐
- CF 868 F. Yet Another Minimization Problem
F. Yet Another Minimization Problem http://codeforces.com/contest/868/problem/F 题意: 给定一个长度为n的序列.你需要将 ...
- STM32L431仿真卡在HAL_InitTick(TICK_INT_PRIORITY);
1. 使用IAR 8.20版本,STM32L431RBT芯片,JLINK V9仿真器,实际仿真测试的时候卡在如下的函数 /* Use SysTick as time base source and c ...
- oracle 查看锁表及解锁的语句
解锁语句: alter system kill session 'sid, serial#'; alter system kill session '23, 1647'; 查询那些对象被锁: sele ...
- 学习HTML 第三节.接近正题:HTML样式-CSS级联样式表
CSS (Cascading Style Sheets)级联样式表 内联样式 内联样式- 在HTML元素中使用"style" 属性 使用内联样式的方法是在相关的标签中使用样式属性. ...
- SQL数据类型(SQL Server六个类型使用)
SQL数据类型是一个属性,它指定任何对象的数据的类型.在SQL中每一列,变量和表达有相关数据类型. 当创建表时,需要使用这些数据类型. 会选择根据表列要求选择一个特定的数据类型. SQL Server ...
- html js 全选 反选 全不选源代码
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- day06 再谈编码 and 作业讲解
1. 小数据池,(其他语言又叫常量池) id() 查看变量的内存地址 is和== is 判断内存地址是否一致 == 判断内容是否一致 小数据池的作用: 为了快速的创建字符串对象, 可以减少内存的浪费 ...
- linux同步软件
linux同步软件:scp,rsync,inotify,sersync 1.scp: scp就是secure copy,是用来进行远程文件拷贝的.数据传输使用 ssh,并且和ssh 使用相同的认证方式 ...
- Scrum立会报告+燃尽图(十月十四日总第五次):前期宣传工作进行中
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2195 Scrum立会master:段晓睿 一.小组介绍 组长:付佳 组员 ...
- P4tutorial实战
Tutorial样例实战 GitHub仓库地址 参考博客 实验一:SIGCOMM_2015/Sourse_Routing 实验环境: OS:Ubuntu16.04 bmv2:behavioral-mo ...