Luogu 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。
第一眼看到这个题,不难想到先求出起点到所有点的最短路然后bfs,但是再看一眼数据范围,显然是不可行的。。。
那么我们就从最短路那方面去考虑
SPFA就是bfs,而且在找到到一个点的最短路时会进行松弛操作
那么我们不难想到,在每次松弛一个点时,可能就找到了到这个点的最短路
然后不难想到,这时到这个点的最短路的条数等于到前驱节点的最短路的条数
但是到这个点的所有最短路不一定只经过一个相同的前驱,那么我们加一个条件,如果松弛的时候,到这个点的距离=到它的最短路的距离,那么最短路的条数加上当前前驱节点的最短路的条数,差不多就是个记忆化
如果一个节点被松弛了,那说明它之前的路径都不是最短路,直接赋值成前驱的最短路条数
然后还要mod 100003(我一开始居然就没注意到,然后就只有60分。。。现在审题太粗了。。。)
其实总结一下,好像一些算法的中间过程可以再进一步的修饰然后就可以解决一些相关问题,比如逆序对和这个,以后说不定还会碰到其他的,如果多的话就再开一篇单独列出
代码
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#define For(i,l,r) for(int i=l;i<=r;++i)
using namespace std;
int read()
{char c;int a=0;bool t=0;while((c=getchar())==' '||c=='\n'||c=='\r');if(c=='-'){t=1;c=getchar();}while(isdigit(c)){a*=10;a+=(c-'0');c=getchar();}return a*(t?-1:1);
}
struct line{int to,next;
}edge[4000001];
int n,m,ans[1000001],last[1000001],dis[1000001];
bool vis[1000001];
void add(int from,int to,int i)
{edge[i].next=last[from];last[from]=i;edge[i].to=to;
}
void spfa()
{int tx;memset(dis,127,sizeof dis);queue<int> q;q.push(1);dis[1]=0;vis[1]=1;ans[1]=1;while(!q.empty()){tx=last[q.front()];while(tx){if(dis[edge[tx].to]>dis[q.front()]+1){dis[edge[tx].to]=dis[q.front()]+1;ans[edge[tx].to]=ans[q.front()];if(!vis[edge[tx].to]){q.push(edge[tx].to);vis[edge[tx].to]=1;}}else if(dis[edge[tx].to]==dis[q.front()]+1){ans[edge[tx].to]+=ans[q.front()];ans[edge[tx].to]%=100003;}tx=edge[tx].next;}vis[q.front()]=0;q.pop();}
}
int main()
{int tx,ty;n=read();m=read();m+=m;For(i,1,m){tx=read();ty=read();add(tx,ty,i++);add(ty,tx,i);}spfa();For(i,1,n)printf("%d\n",ans[i]);return 0;
}
Luogu P1144 最短路计数相关推荐
- 洛谷 P1144 最短路计数 dijkstra
https://www.luogu.org/problem/P1144 题目描述 给出一个NNN个顶点MMM条边的无向无权图,顶点编号为1−N1−N1−N.问从顶点111开始,到其他每个点的最短路有几 ...
- P1144 最短路计数
对于边权都为相同的图,求最短路可以用bfs 题目 #include<cstdio> #include<iostream> #include<algorithm> # ...
- 洛谷 P1606 [USACO07FEB]荷叶塘Lilypad Pond(spfa+最短路计数) 题解
题目来源: https://www.luogu.org/problemnew/show/P1606 题目描述: 题目描述 FJ has installed a beautiful pond for h ...
- BZOJ1491: [NOI2007]社交网络(Floyd 最短路计数)
Time Limit: 10 Sec Memory Limit: 64 MB Submit: 2343 Solved: 1266 [Submit][Status][Discuss] Descrip ...
- 1491. [NOI2007]社交网络【最短路计数】
Description 在社交网络(socialnetwork)的研究中,我们常常使用图论概念去解释一些社会现象.不妨看这样的一个问题. 在一个社交圈子里有n个人,人与人之间有不同程度的关系.我们将这 ...
- 2018.11.05 NOIP模拟 规避(最短路计数)
传送门 正难则反. 考虑计算两人相遇的方案数. 先正反跑一遍最短路计数. 然后对于一条在最短路上的边(u,v)(u,v)(u,v),如果(dis(s,u)*2<total&&di ...
- nssl1338-逃亡路径【最短路计数,bfs】
正题 题目大意 n∗mn*mn∗m的格子,一个走"日"字形的马,从(1,1)(1,1)(1,1)走到(n,m)(n,m)(n,m)的最短路条数. 解题思路 模板最短路计数改一下即可 ...
- [图论]最短路计数(spfa)
最短路计数 Description 给出一个NN个顶点MM条边的无向无权图,顶点编号为1-N1−N.问从顶点11开始,到其他每个点的最短路有几条. Input 第一行包含22个正整数N,MN,M,为图 ...
- 洛谷 1144 最短路计数 bfs
洛谷1144 最短路计数 传送门 其实这道题目的正解应该是spfa里面加一些处理,,然而,,然而,,既然它是无权图,,那么就直接bfs了,用一个cnt记录一下每一个点的方案数,分几种情况讨论一下转移, ...
最新文章
- Linux开发工具的使用
- C++基于多态实现依赖颠倒原则附源码
- 教你3行代码坑崩系统(哈哈哈哈)
- 用QEMU构建嵌入式LINUX系统
- 如何移动没有标题的窗体
- Java面试题-泛型篇十四
- python基础-解释器安装
- AlphaGo算法框架解读
- 新西兰的中国新移民现状:缺乏安全感和归属感
- 计算机远程桌面修复,大师教您Win10远程桌面连接的修复手段
- mysql delete in死锁_delete where in导致的死锁问题
- 关于applicaiton.yml不是绿叶子图标的处理办法
- 鹏哥C语言笔记分享P4
- 快点来学吧!9次Android面试经验总结,已开源
- bootstrap v4 toast轻提示正确用法
- 【开源STC15开发板】STC15F2K60S2开发板
- 蓝牙技术|防丢背包获奖,Find My产品受追捧
- Java工程师培训课(十六【新的领域】)
- 小程序开发(一)新建/拉取项目,配置远程仓库
- 基于Zotero和坚果云的大规模文献同步管理环境配置及常用功能介绍(超详细)