最短路计数 洛谷 1114 最短路
2017-01-14 17:17
393 查看
题目描述
给出一个N个顶点M条边的无向无权图,顶点编号为1~N。问从顶点1开始,到其他每个点的最短路有几条。分析
可以使用最短路。松弛的时候如果遇到没有访问过的则ans[v]=ans[u],如果遇到访问过而且dis[v]==dis[u]+1,则将方案数累计入ans[v]。记得取模
ans的初始值为0,起点为1。
code
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<string> #include<algorithm> #include<stack> #include<queue> #include<vector> using namespace std; struct arr{ int x,y,w,next; }edge[2000200]; int ans[1000200]; int ls[1000200]; int dis[1000200]; int v[1000200]; int n,m,s,t; int edge_m; struct cmp{ bool operator ()(int a,int b){ return dis[a]>dis[b]; } }; //优先队列的定义。 void add(int x,int y,int w) { edge_m++; edge[edge_m]=(arr){x,y,w,ls[x]};ls[x]=edge_m; edge_m++; edge[edge_m]=(arr){y,x,w,ls[y]};ls[y]=edge_m; } int main() { scanf("%d%d",&n,&m); s=1; priority_queue<int,vector<int>,cmp> Q; memset(dis,63,sizeof(dis)); for (int i=1;i<=m;i++) { int x,y,w; scanf("%d%d",&x,&y); w=1; add(x,y,w); } ans[s]=1; dis[s]=0; v[s]=1; Q.push(s); for (int ii=1;ii<=n;ii++) { int x=Q.top(); Q.pop(); for (int j=ls[x];j;j=edge[j].next) { if (dis[edge[j].y]>dis[x]+edge[j].w) { dis[edge[j].y]=dis[x]+edge[j].w; ans[edge[j].y]=ans[x]; if (!v[edge[j].y]) { v[edge[j].y]=1; Q.push(edge[j].y); } } else if (dis[edge[j].y]==dis[x]+edge[j].w) ans[edge[j].y]=(ans[edge[j].y]+ans[x])%100003; } } for (int ii=1;ii<=n;ii++) printf("%d\n",ans[ii]%100003); }
相关文章推荐
- 关于 handler 书写代码 引起的几个问题
- python基础语法(7) 函数2
- SQL Server ->> SQL Server 2016新特性之 --- Query Store
- MVC ---- T4模板的小练习
- 树莓派uboot的串口初始化(uboot驱动结构 2通用解析)
- PAT乙级1056
- 【matlab】isstrprop 解读
- UVA All in All 10340
- Android异步任务机制—AsyncTask
- 深入理解 Java G1 垃圾收集器
- poj 2728 Desert King (最优比率生成树)
- extern "c"用法解析
- [bzoj1002] [FJOI2007]轮状病毒轮状病毒(基尔霍夫矩阵)
- window下与Ubuntu14 虚拟机的samba共享
- 树状数组
- 网络连接请求
- Windows下保存git 用户名和密码
- 多次复制可粘贴小工具
- bind源码解析
- BZOJ 1018: [SHOI2008]堵塞的交通traffic [线段树 区间信息]