博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[題解]luogu_P1144最短路計數
阅读量:4574 次
发布时间:2019-06-08

本文共 1209 字,大约阅读时间需要 4 分钟。

 


1.無權圖最短路邊權為1

2.如果兩個點恰好不能被更新(d[y]==d[x]+1)那麼就能通過x的所有最短路到達y,所以ans[y]+=ans[x]

3.如果兩個點不能恰好被更新(d[y]>d[x]+1)那麼到達y的最短路目前只有通過x到達,所以ans[y]=ans[x]

#include
#include
#include
#include
using namespace std;const int maxn=1000010;const int maxm=2000010;const int mod=100003;int n,m;int head[maxn],cnt;struct node{ int v,nxt;}e[maxn*2];void add(int u,int v){ e[++cnt].v=v;e[cnt].nxt=head[u];head[u]=cnt;}queue
q;int d[maxn],v[maxn],c[maxn];void spfa(){ d[1]=0;v[1]=1;q.push(1); c[1]=1;//初值 while(!q.empty()){ int x=q.front();q.pop();v[x]=0; for(int i=head[x];i;i=e[i].nxt){ int y=e[i].v; if(d[y]>d[x]+1){ d[y]=d[x]+1; c[y]=c[x];//覆蓋 if(!v[y])q.push(y),v[y]=1; } else if(d[y]==d[x]+1)c[y]+=c[x],c[y]%=mod;//相等就合併 } }}int main(){ scanf("%d%d",&n,&m); for(int i=1,x,y;i<=m;i++){ scanf("%d%d",&x,&y); add(x,y);add(y,x); } memset(d,0x3f,sizeof(d)); spfa(); for(int i=1;i<=n;i++)printf("%d\n",c[i]);}

 

转载于:https://www.cnblogs.com/superminivan/p/10713331.html

你可能感兴趣的文章
C++ stat判断路径是文件还是目录
查看>>
动态代理
查看>>
ie11下,接受postmessage返回的信息
查看>>
7 big mistakes to avoid in first year of retirement
查看>>
小技巧
查看>>
python接口自动化20-requests获取响应时间(elapsed)与超时(timeout) ok试了 获取响应时间的...
查看>>
linux打包压缩与搜索命令
查看>>
冒泡排序
查看>>
windows phone 三种数据共享的方式(8)
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_02-继承与多态_第1节 继承_13-Java继承的三个特点...
查看>>
阶段1 语言基础+高级_1-3-Java语言高级_05-异常与多线程_第1节 异常_14_自定义异常类的练习...
查看>>
第五周总结
查看>>
Poj 2328 Guessing Game(猜数字游戏)
查看>>
Hibernate基础知识
查看>>
20150518 字符设备驱动
查看>>
UIView的动画之初步学习
查看>>
中小企业实施OA的意义
查看>>
es6 数组
查看>>
JS判断是否在微信浏览器打开
查看>>
javascript中typeof和instanceof的区别
查看>>