题目描述

“RP餐厅”的员工素质就是不一般,在齐刷刷的算出同一个电话号码之后,就准备让HZH,TZY去送快餐了,他们将自己居住的城市画了一张地图,已知在他们的地图上,有N个地方,而且他们目前处在标注为“1”的小镇上,而送餐的地点在标注为“N”的小镇。(有点废话)除此之外还知道这些道路都是单向的,从小镇I到J需要花费D[I,J]的时间,为了更高效快捷的将快餐送到顾客手中,

他们想走一条从小镇1到小镇N花费最少的一条路,但是他们临出发前,撞到因为在路上堵车而生气的FYY,深受启发,不能仅知道一条路线,万一。。。,于是,他们邀请FYY一起来研究起了下一个问题:这个最少花费的路径有多少条?

输入输出格式

输入格式:

输入文件第一行为两个空格隔开的数N,E,表示这张地图里有多少个小镇及有多少边的信息。

下面E行,每行三个数I、J、C,表示从I小镇到J小镇有道路相连且花费为C.(注意,数据提供的边信息可能会重复,不过保证I<>J,1<=I,J<=n)。

输出格式:

输出文件包含两个数,分别是最少花费和花费最少的路径的总数.

两个不同的最短路方案要求:路径长度相同(均为最短路长度)且至少有一条边不重合。

若城市N无法到达则只输出一个(‘No answer’);

输入输出样例

输入样例#1: 复制

5 4
1 5 4
1 2 2
2 5 2
4 1 1
输出样例#1: 复制

4 2

说明

对于30%的数据 N<=20;

对于100%的数据 1<=N<=2000,0<=E<=N*(N-1), 1<=C<=10.

这个题spfa有坑,用dij

/*同最短路数*/
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 4000010
using namespace std;
int n,m,tot;
int map[][];
int dis[MAXN],vis[MAXN],ans[MAXN];
int to[MAXN],net[MAXN],head[MAXN],cap[MAXN];
int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
void add(int u,int v,int w){
to[++tot]=v;cap[tot]=w;net[tot]=head[u];head[u]=tot;
}
void spfa(int s){
queue<int>que;
memset(vis,,sizeof(vis));
memset(dis,0x7f,sizeof(dis));
que.push(s);vis[s]=;dis[s]=;ans[s]=;
while(!que.empty()){
int now=que.front();
que.pop();vis[now]=;
if(now==n) continue;
for(int i=head[now];i;i=net[i])
if(dis[to[i]]>dis[now]+cap[i]){
ans[to[i]]=ans[now];
dis[to[i]]=dis[now]+cap[i];
if(!vis[to[i]]){
vis[to[i]]=;
que.push(to[i]);
}
}
else if(dis[to[i]]==dis[now]+cap[i]){
ans[to[i]]+=ans[now];
if(!vis[to[i]]){
vis[to[i]]=;
que.push(to[i]);
}
}
ans[now]=;
}
}
int main(){
// freopen("lpp1.in","r",stdin);
scanf("%d%d",&n,&m);
memset(map,0x7f,sizeof(map));
for(int i=;i<=m;i++){
int u=read();
int v=read();
int w=read();
map[u][v]=min(map[u][v],w);
}
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(map[i][j]!=0x7f7f7f7f)
add(i,j,map[i][j]);
spfa();
if(dis[n]!=0x7f7f7f7f) printf("%d %d\n",dis[n],ans[n]);
else printf("No answer\n");
}

spfa100

/*同最短路数*/
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 4000010
using namespace std;
int n,m,tot;
int map[][];
struct nond{ int dis,id; };
int dis[MAXN],vis[MAXN],ans[MAXN];
int to[MAXN],net[MAXN],head[MAXN],cap[MAXN];
int read(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
bool operator < (const nond &a,const nond &b){
return a.dis>b.dis;
}
void add(int u,int v,int w){
to[++tot]=v;cap[tot]=w;net[tot]=head[u];head[u]=tot;
}
void dijkstra(int be){
priority_queue<nond>que;
for(int i=;i<=n;i++) dis[i]=0x7f7f7f7f;
dis[be]=;que.push((nond){,be});ans[be]=;
while(!que.empty()){
nond now=que.top();
que.pop();
if(dis[now.id]!=now.dis) continue;
for(int i=head[now.id];i;i=net[i])
if(dis[to[i]]>dis[now.id]+cap[i]){
ans[to[i]]=ans[now.id];
dis[to[i]]=dis[now.id]+cap[i];
que.push((nond){dis[to[i]],to[i]});
}
else if(dis[to[i]]==dis[now.id]+cap[i])
ans[to[i]]+=ans[now.id];
}
}
int main(){
//freopen("lpp1.in","r",stdin);
scanf("%d%d",&n,&m);
memset(map,0x7f,sizeof(map));
for(int i=;i<=m;i++){
int u=read();
int v=read();
int w=read();
map[u][v]=min(map[u][v],w);
}
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(map[i][j]!=0x7f7f7f7f)
add(i,j,map[i][j]);
dijkstra();
if(dis[n]!=0x7f7f7f7f) printf("%d %d\n",dis[n],ans[n]);
else printf("No answer\n");
}

dijkstra100

洛谷 P1608 路径统计的更多相关文章

  1. 洛谷——P1608 路径统计

    P1608 路径统计 题目描述 “RP餐厅”的员工素质就是不一般,在齐刷刷的算出同一个电话号码之后,就准备让HZH,TZY去送快餐了,他们将自己居住的城市画了一张地图,已知在他们的地图上,有N个地方, ...

  2. 洛谷P1608路径统计

    题目 这个提示一个简单的最短路计数,除了用数组存上最短路的个数的做法以外,还有可以在得出最短路之后,搜索加剪枝的方法来通过该题. 可以反向搜索用A*的方法来通过,但是这个题的去重十分的恶心,需要一些玄 ...

  3. 洛谷P1608 路径计数

    题目简介 题目描述 给你一个N点M边的有向图,求第一个点到第n个点的最短路和最短路条数 题目分析 很明显直接Dijkstra求最短路,加一个最短路计数 如下: if(dis[y]>dis[x]+ ...

  4. [洛谷U40581]树上统计treecnt

    [洛谷U40581]树上统计treecnt 题目大意: 给定一棵\(n(n\le10^5)\)个点的树. 定义\(Tree[l,r]\)表示为了使得\(l\sim r\)号点两两连通,最少需要选择的边 ...

  5. 【luogu P1608 路径统计】 题解

    题目链接:https://www.luogu.org/problemnew/show/P1608 补上一发最短路计数! 感谢王强qwqqqq @Lance1ot #include <queue& ...

  6. luogu P1608 路径统计

    题目描述 “RP餐厅”的员工素质就是不一般,在齐刷刷的算出同一个电话号码之后,就准备让HZH,TZY去送快餐了,他们将自己居住的城市画了一张地图,已知在他们的地图上,有N个地方,而且他们目前处在标注为 ...

  7. 洛谷——P1176 路径计数2

    P1176 路径计数2 题目描述 一个N \times NN×N的网格,你一开始在(1,1)(1,1),即左上角.每次只能移动到下方相邻的格子或者右方相邻的格子,问到达(N,N)(N,N),即右下角有 ...

  8. 洛谷 P1176 路径计数2

    P1176 路径计数2 题目描述 一个N×N的网格,你一开始在(1, 1),即左上角.每次只能移动到下方相邻的格子或者右方相邻的格子,问到达(N, N),即右下角有多少种方法. 但是这个问题太简单了, ...

  9. 洛谷——P1179 数字统计

    https://www.luogu.org/problem/show?pid=1179 题目描述 请统计某个给定范围[L, R]的所有整数中,数字 2 出现的次数. 比如给定范围[2, 22],数字 ...

随机推荐

  1. [ USACO 2013 OPEN ] Photo

    \(\\\) Description 有一个长度为 \(n\) 的奶牛队列,奶牛颜色为黑或白. 现给出 \(m\) 个区间 \([L_i,R_i]\) ,要求:每个区间里 有且只有一只黑牛 . 问满足 ...

  2. PHP到浏览器的缓存机制

    参考地址:http://www.cnblogs.com/godok/p/6341300.html 所有的php程序员都知道在php脚本里面执行 echo “1”;访客的浏览器里面就会显示“1”. 但是 ...

  3. RDO、SAD、SATD、λ相关概念【转】

    率失真优化概述: 率失真优化(Rate D isto r t i on Op t i m ized)策略是在率失真理论[3 ]的基础上提出的一种代价函数方案, RDO 的主要思想是, 在计算代价函数时 ...

  4. chatops--rocketchat+hubot

    chatops--rocketchat+hubot 原文地址:http://www.cnblogs.com/caoguo/p/7221956.html 先放几张图 # rocket.chat # hu ...

  5. (转)淘淘商城系列——分布式文件系统FastDFS

    http://blog.csdn.net/yerenyuan_pku/article/details/72801777 商品添加的实现,包括商品的类目选择,即商品属于哪个分类?还包括图片上传,对于图片 ...

  6. ZooKeeper系列(三)

    前面虽然配置了集群模式的Zookeeper,但是为了方面学建议在伪分布式模式的Zookeeper学习Zookeeper的shell命令. 一.Zookeeper的四字命令 Zookeeper支持某些特 ...

  7. laravel jwt 做API 退出登录(注销) 该怎么弄? 如何让token失效

    laravel jwt 做API 退出登录(注销) 该怎么弄? 如何让token失效 php框架 laravel 2.1k 次浏览 问题对人有帮助,内容完整,我也想知道答案0问题没有实际价值,缺少关键 ...

  8. js 代码优化

  9. POJ中和质数相关的三个例题(POJ 2262、POJ 2739、POJ 3006)

    质数(prime number)又称素数,有无限个.一个大于1的自然数,除了1和它本身外,不能被其他自然数整除,换句话说就是该数除了1和它本身以外不再有其他的因数:否则称为合数.      最小的质数 ...

  10. vim里面搜索字符串

    直接在命令模式/+字符串就能搜索到,查找下一个,按“n”