题目传送门

常规的最短路计数问题:注意有重边(重边不用理,看样例),自环(读入时过滤)。

另外这个无向图没有权,其实可以直接bfs做,但考虑到以后带权的情况,按spfa走了。

水题被卡了三次(嘤嘤嘤

第一次40pts:忘取膜了(???

第二次80pts:加了多余的判断,实质还是思路不清晰

第三次100pts:去了冗余的判断,终于A了。

思路

记录f数组表示f[i]为以i为终点,1为起点的最短路条数。初始只有f[1]=1。

其余在松弛的时候如果更新,f[v]=f[u];

如果恰好相等(有相同最短路径)(这种情况不能和上面的情况一起判断),就f[v]+=f[u]

Code

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
using namespace std;
const int inf=;
int n,m,s;
int p=;
int num;
int pre[],f[];
struct node{
int to,val,next;
}edge[];
int dis[];
bool visit[];
void add(int x,int y,int z)
{
num++;
edge[num].val=z;
edge[num].to=y;
edge[num].next=pre[x];
pre[x]=num;
}
void spfa()
{
queue<int>q;
for(int i=;i<=n;i++)
dis[i]=inf;
q.push();
dis[]=;f[]=;
visit[]=;
while(!q.empty())
{
int u=q.front();
q.pop();
visit[u]=;
for(int i=pre[u];i>;i=edge[i].next)
{
int v=edge[i].to;
//if(u==1) (f[v]=1)%=p;
if(dis[v]>dis[u]+edge[i].val)
{
dis[v]=dis[u]+edge[i].val;
/*if(u!=1)*/ (f[v]=f[u])%=p;
if(visit[v]==)
{
visit[v]=;
q.push(v);
}
}
else if(dis[v]==dis[u]+edge[i].val)
(f[v]+=f[u])%=p;
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=m;i++)
{
int x=,y=,z=;
scanf("%d%d",&x,&y);
if(x==y) continue;
add(x,y,);
add(y,x,);
}
spfa();
for(int i=;i<=n;i++)
printf("%d\n",f[i]);
return ;
}

* Update 2018.9.22

做NOIp2017逛公园的时候发现自己的最短路计数算法有些Bug==

导致30分没有成功拿到。

做了一道加强版的最短路计数 路径统计

 #include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring> using namespace std;
typedef long long ll; int n,m,fake;
int vis[],dis[];
ll f[];
int e[][]; void spfa()
{
memset(dis,,sizeof(dis));
fake=dis[];
queue<int>q;
q.push();vis[]=;dis[]=;f[]=;
while(!q.empty())
{
int u=q.front();q.pop();
vis[u]=;
if(u==n) continue;
for(int i=;i<=n;i++)
{
if(dis[i]==dis[u]+e[u][i])
f[i]+=f[u];
if(dis[i]>dis[u]+e[u][i])
{
dis[i]=dis[u]+e[u][i];
f[i]=f[u];
}
if(f[i]&&!vis[i]) vis[i]=,q.push(i);
}
f[u]=;
}
} int main()
{
scanf("%d%d",&n,&m);
memset(e,,sizeof(e));
for(int i=;i<=m;i++)
{
int x=,y=,z=;
scanf("%d%d%d",&x,&y,&z);
e[x][y]=min(e[x][y],z);
}
spfa();
if(fake==dis[n]) printf("No answer");
else printf("%d %lld",dis[n],f[n]);
return ;
}

还是用这个吧qwq

Luogu P1144 最短路计数 【最短路】 By cellur925的更多相关文章

  1. 洛谷P1144-最短路计数-最短路变形

    洛谷P1144-最短路计数 题目描述: 给出一个\(N\)个顶点\(M\)条边的无向无权图,顶点编号为\(1-N\).问从顶点\(1\)开始,到其他每个点的最短路有几条. 思路: \(Dijkstra ...

  2. POJ - 3463 Sightseeing 最短路计数+次短路计数

    F - Sightseeing 传送门: POJ - 3463 分析 一句话题意:给你一个有向图,可能有重边,让你求从s到t最短路的条数,如果次短路的长度比最短路的长度多1,那么在加上次短路的条数. ...

  3. 解题报告:luogu P1144 最短路计数

    题目链接:P1144 最短路计数 很简单的一道\(dfs\),然而我又跑了一遍\(dij\)和排序,时间复杂度是\(O(nlog n)\) 注意:\(1\).搜索时向\(dis[j]=dis[cur] ...

  4. 【Luogu】P1144最短路计数(BFS)

    题目链接 此题使用BFS记录最短路的条数.思路如下:因为是无权无向图,所以只要被BFS到就是最短路径.因此可以记录该点的最短路和最短路的条数:如果点y还没被访问过,则记录dis[y],同时令ans[y ...

  5. P1144 最短路计数 题解 最短路应用题

    题目链接:https://www.luogu.org/problem/P1144 其实这道题目是最短路的变形题,因为数据范围 \(N \le 10^6, M \le 2 \times 10^6\) , ...

  6. P1144 最短路计数

    P1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M,为图的顶 ...

  7. 洛谷 P1144 最短路计数 解题报告

    P1144 最短路计数 题目描述 给出一个\(N\)个顶点\(M\)条边的无向无权图,顶点编号为\(1-N\).问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 第一行包含2个正 ...

  8. 洛谷P1144 最短路计数 及其引申思考

    图论题目练得比较少,发一道spfa的板子题目- 题目:P1144 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: ...

  9. 洛谷——P1144 最短路计数

    P1144 最短路计数 题目描述 给出一个N个顶点M条边的无向无权图,顶点编号为1-N.问从顶点1开始,到其他每个点的最短路有几条. 输入输出格式 输入格式: 输入第一行包含2个正整数N,M,为图的顶 ...

随机推荐

  1. 转:TLV 格式及编解码示例

    TLV是一种可变格式,意思就是: Type类型, Lenght长度,Value值: Type和Length的长度固定,一般那是2.4个字节(这里统一采用4个字节): Value的长度有Length指定 ...

  2. Spring中基于AOP的XML架构

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/aop-with-spring-framenwork/xml-schema-based-aop-wi ...

  3. java获取本机机器名

    java获取本机机器名 InetAddress.getLocalHost().getHostName().toString();

  4. arcgis安装路径的获得

    //Get the ArcGIS install location string sInstall = ESRI.ArcGIS.RuntimeManager.ActiveRuntime.Path; / ...

  5. (转)Delphi2009初体验 - 语言篇 - 智能指针(Smart Pointer)的实现

     转载:http://www.cnblogs.com/felixYeou/archive/2008/08/27/1277250.html 快速导航 一. 回顾历史二. 智能指针简介三. Delphi中 ...

  6. zz年度热门编程语言排行榜

    原文在这里:Link 蛮有意思的,可以看看.

  7. 实例 mount新硬盘方法

    0.建立挂载文件夹: mkdir /mnt/sdb1 1 .查看新硬盘: fdisk -l 2. 硬盘分区: fdisk /dev/sdb1 根据提示,依次输入 n, p, 1, 以及两次回车,然后是 ...

  8. [RxJS] Implement the `map` Operator from Scratch in RxJS

    While it's great to use the RxJS built-in operators, it's also important to realize you now have the ...

  9. graph driver-device mapper-03thin pool基本操作

    // 在thin pool中创建一个新thin device // 调用路径:driver.Create() 1.1 func (devices *DeviceSet) AddDevice(hash, ...

  10. android 怎样将主菜单图标改成按安装时间排序

    1. 在 LauncherModel.java 中增加例如以下代码, 假设是KK Launcher3 ApplicationInfo要替换为AppInfo public static final Co ...