洛谷——P1144 最短路计数
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。
变形的spfa(说白了就是一个bfs),在进行最短路查询的时候判断是否出现了距离相同的路径。
#include<queue> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define N 2000000 #define mod 100003 using namespace std; queue<int>q; bool vis[N]; int n,m,x,y,tot,head[N],ans[N],dis[N]; int read() { ,f=; char ch=getchar(); ; ch=getchar();} +ch-'; ch=getchar();} return x*f; } struct Edge { int to,next,from; }edge[N<<]; int add(int x,int y) { tot++; edge[tot].to=y; edge[tot].next=head[x]; head[x]=tot; } int main() { n=read(),m=read(); ;i<=m;i++) x=read(),y=read(),add(x,y),add(y,x); memset(dis,0x3f3f3f3f,sizeof(dis)); q.push(),dis[]=,vis[]=]=; while(!q.empty()) { x=q.front();q.pop();vis[x]=false; for(int i=head[x];i;i=edge[i].next) { int to=edge[i].to; ) { dis[to]=dis[x]+; ans[to]=ans[x]%mod; if(!vis[to]) { vis[to]=true; q.push(to); } } ) { ans[to]=(ans[x]+ans[to])%mod; if(!vis[to]) { vis[to]=true; q.push(to); } } } } ;i<=n;i++) printf("%d\n",ans[i]); ; }
#include<cstdio> #include<iostream> #include<cstring> #include<string> #include<cmath> #include<algorithm> #include<queue> #include<cstdlib> using namespace std; struct Edge//邻接表存边 { int t; int nexty; }edge[]; ]={};//邻接表的东东(存以i为发出点的编号最大的边的编号)……有人不懂吗 ; inline void add(int a,int b)//邻接表添加边 { cnt++; edge[cnt].t=b; edge[cnt].nexty=head[a]; head[a]=cnt; } ]={};//每一个点的最短路径条数 ]={};//用来避免重复的统计表,存当前在队列中,到节点i的最短路径条数 ];//存最短路径 ]={};//是否在队列中 queue<int>spfa;//SPFA所用队列 int main() { int n,m; scanf("%d%d",&n,&m); int a,b; ;i<m;i++) { scanf("%d%d",&a,&b); add(a,b); add(b,a);//存边 } ;i<=n;i++)dis[i]=2e9; dis[]=;//初始化dis ]=true; js[]=;//1到1最短路径1条 rdjs[]=;//此次队列中,到1的最短路径条数为1 spfa.push();//将1加入队列 int curr; while(!spfa.empty()) { curr=spfa.front();//更新发出点 ;i=edge[i].nexty)//遍历出发边 { )//若最短路有变 { dis[edge[i].t]=dis[curr]+;//更新最短路 rdjs[edge[i].t]=js[edge[i].t]=rdjs[curr]%;//以前的计数均舍弃,更新到出发点的到达路径条数 if(!in[edge[i].t]) {//加入队列 in[edge[i].t]=true; spfa.push(edge[i].t); } } else )//若又有一条最短路 { js[edge[i].t]=(js[edge[i].t]+rdjs[curr])%;//增加最短路个数 rdjs[edge[i].t]=(rdjs[edge[i].t]+rdjs[curr])%;//在rdjs上更新,避免重复 if(!in[edge[i].t]) {//入队 in[edge[i].t]=true; spfa.push(edge[i].t); } } } in[curr]=false; rdjs[curr]=;//此次的最短路统计已用完,将此节点的最短路条数初始化,避免重复(在此题中似乎并没有什么用) spfa.pop();//出队 } ;i<=n;i++)printf("%d\n",js[i]);//输出 ; }
比较详细一点的题解
洛谷——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\)个正 ...
- 洛谷P1144 最短路计数 及其引申思考
图论题目练得比较少,发一道spfa的板子题目- 题目:P1144 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: ...
- 洛谷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行 ...
随机推荐
- redis列表,字典,管道,vue安装,创建项目
redis mysql,redis,mogondb 1.mysql,oracle:关系型数据库,有表概念 2.redis,mongodb/nosql:非关系型数据库 没有表概念 mongodb存储在硬 ...
- Meteor Shower POJ - 3669 (bfs+优先队列)
Meteor Shower Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 26455 Accepted: 6856 De ...
- 开源OA系统启动:基础数据,工作流设计
原文:http://www.cnblogs.com/kwklover/archive/2007/01/13/bpoweroa_03_baseandworkflowdesign.html自从开源OA系统 ...
- bash之条件测试if/else
bash之条件测试: if/then结构 条件测试(CONDITION): test EXPRESSION:测试条件表达式正确否 [ EXPRE ...
- VS重置开发环境的方法
经常由于各种插件的原因,导致VS有使用过程中出现断点进不去等各种情况的时候,这个方法可以让你的VS回到最初安装的状态,当然,这时候,各种配置也没有了,不到万不得已就勿使用. 下面以Vs2015来说明: ...
- 在从1到n的正数中1出现的次数 【微软面试100题 第三十题】
题目要求: 给定 一个十进制正整数N,写下从1开始,到N的所有整数,然后数一下其中出现的所有“1”的个数. 例如:N = 2,写下1,2.这样只出现了1个“1”. N = 12 ...
- verilog写的LCD1602 显示
在读本文之前,请先阅读 LCD1602 的 datasheet(百度到处都是) ,熟悉有关的11条指令集. LCD1602的11个指令集链接 http://www.cnblogs.com/aslmer ...
- [git 学习篇] --创建git创库
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013743256916071d ...
- [python subprocess学习篇] 调用系统命令
http://www.jb51.net/article/57208.htm 3).Popen.communicate(input=None):与子进程进行交互.向stdin发送数据,或从stdout和 ...
- java EE技术体系——CLF平台API开发注意事项(3)——API安全访问控制
前言:提离职了,嗯,这么多年了,真到了提离职的时候,心情真的很复杂.好吧,离职阶段需要把一些项目中的情况说明白讲清楚,这篇博客就简单说一下在平台中对API所做的安全处理(后面讲网关还要说,这里主要讲代 ...