最短路计数
提交数: 51, 通过率: 54.9%, 平均分: 65.49
题目描述:
给出一个N个顶点M条边的无向无权图,顶点编号为1~N。问从顶点1开始,到其他每个点的最短路有几条?
输入格式:
第一行包含2个正整数N, M, 分别为图的顶点数与边数。
接下来M行,每行两个正整数x, y,表示有一条从顶点x连向点y的边。请注意可能有自环与重边。
输出格式:
共N行,每行一个非负整数,第i行输出从顶点1到顶点i有多少条不同的最短路,由于结果的值有可能会很大,你只需要输出结果 mod 100003即可。如果无法到达顶点i,则输出0。
数据范围:
对于20%的数据,N
对于60%的数据,N
对于100%的数据,N
样例输入:
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条)。
此题使用SPFA(Shortest Path Faster Algorithm)
#include
using namespace std;
int n,m,f[1000005],t[4000005],n1[4000005],g,dis[1000005],ans[1000005];
bool book[1000005];
queue que;
void SPFA(int u,int服务器托管 v) {
t[g]=v,n1[g]=f[u],f[u]=g++;
}
int dfs(int u) {
if(服务器托管ans[u])return ans[u];//如果ans[u]!=0直接输出,否则更新并输出
for(int i=f[u]; i!=-1; i=n1[i])
if(dis[u]-1==dis[t[i]])ans[u]=(ans[u]+dfs(t[i]))%100003;//统计最短路的条数并更新
return ans[u];
}
int main() {
scanf(“%d%d”,&n,&m);
for(int i=1; i for(int i=1,u,v; i dis[1]=0,que.push(1),book[1]=1;
while(!que.empty()) {//循环寻找最短路
int f1=que.front();//更新出发点
que.pop(),book[f1]=0;//删除已遍历的元素
for(int i=f[f1]; i!=-1; i=n1[i])//遍历出发的边
if(dis[f1]+1 dis[t[i]]=dis[f1]+1;//更新最短路
if(!book[t[i]])que.push(t[i]),book[t[i]]=1;//标记已遍历过的节点和边
}
}
ans[1]=1;
for(int i=1; i return 0;
}
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
相关推荐: 算能RISC-V通用云编译飞桨paddlepaddle@openKylin留档
尝试一在riscv里编译飞桨。 先总结: 下载飞桨代码,参照pr修改代码 然后编译 cmake ../ -DWITH_GPU=OFF -DWITH_RISCV=ON make -j 16 TARGET=RISCV64_GENERIC 编译好后安装: pip i…