概述
本人也是初学最短路,欢迎交流。
关于dijkstra
P1144 最短路计数
原题链接:传送门
思路:
- 简单的dij计数,基本思想是dij中的松弛操作,这里假设d[]为距离,s[]为最短路路径数。
- if d[v]>d[u]+w ,则 s[v] =s[u]; 如果最短路得到更新,则用s[u]的路径更新s[v];
- if d[v]=d[u]+w , 则 s[v]+=s[u]; 如果同样是最短路,则s[v]的最短路数加上s[u]得到更新。
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int manx=1e6+5;
const int mamx=2e6+5;
const int mod=100003;
int head[manx],d[manx],s[manx];
bool vis[manx];
int n,m,k=0;
struct node{
int v,next;
}a[mamx];
void add(int u,int v)
{
a[++k].next=head[u];
a[k].v=v;
head[u]=k;
}
priority_queue<pair<int,int> >q;
void dij()
{
for(int i=1;i<=n;i++) d[i]=1e9,vis[i]=0,s[i]=0;
q.push(make_pair(0,1));
d[1]=0;
s[1]=1; //路径数初始化为1
while(q.size())
{
int u=q.top().second;
q.pop();
if(vis[u]) continue;
vis[u]=1;
for(int i=head[u];i;i=a[i].next)
{
int v=a[i].v;
if(d[v]>d[u]+1) d[v]=d[u]+1,s[v]=s[u]%mod,q.push(make_pair(-d[v],v));
else if(d[v]==d[u]+1) s[v]=(s[v]+s[u])%mod;
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
dij();
for(int i=1;i<=n;i++)
printf("%dn",s[i]);
return 0;
}
最后
以上就是爱笑黑裤为你收集整理的P1144 最短路计数P1144 最短路计数的全部内容,希望文章能够帮你解决P1144 最短路计数P1144 最短路计数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复