luogu 1608 路径统计--最短路计数
2024-09-29 01:01:12
https://www.luogu.org/problemnew/show/P1608
题意https://www.cnblogs.com/rmy020718/p/9440588.html相似,建议还没做的先去做一下。
当你看完上一题,就已经对最短路计数大体有一个思想了,但是本题中没有说不保证没有重边和自环,那么开一个map数组记录一下就好了,自环的话我使用spfa解决的,那么我们就可以按部就班的写最短路计数了。
不过有个bug源自于spfa算法,见下图。
当你按spfa的手动模拟的时候你会发现到达5号点的路径有3条,但是其真实路径只有两条,我们应该在处理完每一个点后将这个点的路径数量清零(在其更新完其他点以后),避免二次计算的时候再次累加。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
using namespace std;
int i,j,m,n;
int head[];
int us[];
int t[];
int dis[];
int a[][];
queue<int>q; int r()
{
int aans=;
char ch=getchar();
while(ch<''||ch>'')
ch=getchar();
while(ch>=''&&ch<='')
{
aans*=;
aans+=ch-'';
ch=getchar();
}
return aans;
} int spfa(int x)
{
q.push(x);dis[x]=;t[x]=;
while(!q.empty())
{
int x=q.front();
q.pop();
us[x]=;
if(x==n)
continue;
for(i=;i<=n;i++)
{
if(dis[x]+a[x][i]==dis[i])
t[i]+=t[x];
if(dis[x]+a[x][i]<dis[i])
{
dis[i]=dis[x]+a[x][i];
t[i]=t[x];
}
if(t[i]&&!us[i])
us[i]=,q.push(i);
}
t[x]=;
} } int main()
{
n=r(),m=r();
int x,y,z;
memset(a,,sizeof(a));
memset(dis,,sizeof(dis)); for(i=;i<=m;i++)
{
x=r(),y=r(),z=r();
if(a[x][y])a[x][y]=min(z,a[x][y]);
else a[x][y]=z;
}
spfa();
if(dis[n]!=a[][])cout<<dis[n]<<" "<<t[n]<<endl;
else cout<<"No answer"<<endl;
return ;
}
最新文章
- boost之lexical_cast
- 20145224&;20145238 《信息安全系统设计基础》 第五次实验
- 如何设置eclipse字体及大小
- ";本地泛解析";或者叫做”域名劫持泛解析“,做开发二级域名在内网测试
- spm总结
- JSON 之 SuperObject(6): 方法
- “Win”组合键
- 2301: [HAOI2011]Problem b
- java设计模式之 单例模式 Singleton
- 一行JavaScript代码获取页面中的所有超链接地址
- InfluxDB读写性能测试
- MySQL索引的使用方式
- python进阶-------进程线程(二)
- 在windows10上配置Android的环境变量
- OpenCV轮廓检测,计算物体旋转角度
- keepalived+双主实践HA
- Android给控件添加默认点击效果
- 微信支付之JsApi支付
- redis 中用正则找key
- linux初始