概述
题目描述
给出一个N个顶点M条边的无向无权图,顶点编号为1~N。问从顶点1开始,到其他每个点的最短路有几条。
输入输出格式
输入格式:
输入第一行包含2个正整数N,M,为图的顶点数与边数。
接下来M行,每行两个正整数x, y,表示有一条顶点x连向顶点y的边,请注意可能有自环与重边。
输出格式:
输出包括N行,每行一个非负整数,第i行输出从顶点1到顶点i有多少条不同的最短路,由于答案有可能会很大,你只需要输出mod 100003后的结果即可。如果无法到达顶点i则输出0。
输入输出样例
输入样例#1:
5 7
1 2
1 3
2 4
3 4
2 3
4 5
4 5
输出样例#1:
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 ≤ 100000,M ≤ 200000。
【分析】
小水题,spfa宽搜解决。
【代码】
//洛谷 P1144 最短路计数
#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#define fo(i,j,k) for(i=j;i<=k;i++)
#define M(a) memset(a,0,sizeof a)
using namespace std;
vector <int> f[100001];
int q[100001],ans[100001],c[100001];
bool vis[100001];
int main()
{
int n,m,i,j,k,x,y,u,v;
scanf("%d%d",&n,&m);
fo(i,1,m)
{
scanf("%d%d",&x,&y);
f[x].push_back(y);
f[y].push_back(x);
}
int h=0,t=1;
q[1]=ans[1]=c[1]=1;
while(h<t)
{
u=q[++h];
x=f[u].size()-1;
fo(i,0,x)
{
v=f[u][i];
if(c[v]==0)
{
c[v]=c[u]+1;
q[++t]=v;
ans[v]=(ans[v]+ans[u])%100003;
}
else if(c[v]==c[u]+1)
ans[v]=(ans[v]+ans[u])%100003;
}
}
fo(i,1,n) printf("%dn",ans[i]%100003);
return 0;
}
最后
以上就是俭朴蜜蜂为你收集整理的洛谷 P1144 最短路计数的全部内容,希望文章能够帮你解决洛谷 P1144 最短路计数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复