洛谷 1608 路径统计

【题解】

  最短路计数的模板题吧。。要把重边判掉。。

  

 1 #include<cstdio>
 2 #include<algorithm>
 3 #define N 2010
 4 #define rg register
 5 using namespace std;
 6 int n,m,tot=0,dis[N],pos[N],last[N],cnt[N],rec[N][N][11];
 7 struct edge{
 8     int to,pre,dis;
 9 }e[N*N];
10 struct heap{
11     int poi,dis;
12 }h[N];
13 inline int read(){
14     int k=0,f=1; char c=getchar();
15     while(c<‘0‘||c>‘9‘)c==‘-‘&&(f=-1),c=getchar();
16     while(‘0‘<=c&&c<=‘9‘)k=k*10+c-‘0‘,c=getchar();
17     return k*f;
18 }
19 inline void add(int x,int y,int z){
20     e[++tot]=(edge){y,last[x],z}; last[x]=tot;
21 }
22 inline void up(int x){
23     int fa;
24     while((fa=x>>1)&&h[fa].dis>h[x].dis){
25         swap(h[x],h[fa]); swap(pos[h[x].poi],pos[h[fa].poi]);
26         x=fa;
27     }
28 }
29 inline void down(int x){
30     int son;
31     while((son=x<<1)<=tot){
32         if(son<tot&&h[son+1].dis<h[son].dis) son++;
33         if(h[son].dis<h[x].dis){
34             swap(h[x],h[son]); swap(pos[h[x].poi],pos[h[son].poi]);
35             x=son;
36         }
37         else return;
38     }
39 }
40 inline void dijkstra(int x){
41     h[tot=pos[x]=cnt[x]=1]=(heap){x,dis[x]=0};
42     while(tot){
43         int now=h[1].poi; h[1]=h[tot--]; if(tot) down(1);
44         for(rg int i=last[now],to;i;i=e[i].pre)
45         if(dis[to=e[i].to]>=dis[now]+e[i].dis){
46             if(dis[to]==dis[now]+e[i].dis) cnt[to]+=cnt[now];
47             else{
48                 dis[to]=dis[now]+e[i].dis;
49                 cnt[to]=cnt[now];
50                 if(!pos[to]) h[pos[to]=++tot]=(heap){to,dis[to]};
51                 else h[pos[to]].dis=dis[to];
52                 up(pos[to]);
53             }
54         }
55     }
56 }
57 int main(){
58     n=read(); m=read();
59     for(rg int i=1;i<=n;i++) dis[i]=0X7f7f7f7f;
60     for(rg int i=1;i<=n;i++) cnt[i]=0;
61     for(rg int i=1;i<=m;i++){
62         int u=read(),v=read(),w=read();
63         if(!rec[u][v][w]) rec[u][v][w]++;
64         else continue;
65         add(u,v,w);
66     }
67     dijkstra(1);
68     if(cnt[n]) printf("%d %d\n",dis[n],cnt[n]);
69     else puts("No answer");
70     return 0;
71 }

原文地址:https://www.cnblogs.com/DriverLao/p/8678831.html

时间: 2024-11-05 06:20:40

洛谷 1608 路径统计的相关文章

洛谷——P1608 路径统计

P1608 路径统计 题目描述 “RP餐厅”的员工素质就是不一般,在齐刷刷的算出同一个电话号码之后,就准备让HZH,TZY去送快餐了,他们将自己居住的城市画了一张地图,已知在他们的地图上,有N个地方,而且他们目前处在标注为“1”的小镇上,而送餐的地点在标注为“N”的小镇.(有点废话)除此之外还知道这些道路都是单向的,从小镇I到J需要花费D[I,J]的时间,为了更高效快捷的将快餐送到顾客手中, 他们想走一条从小镇1到小镇N花费最少的一条路,但是他们临出发前,撞到因为在路上堵车而生气的FYY,深受启

洛谷 P1608 路径统计

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

洛谷——P1179 数字统计

https://www.luogu.org/problem/show?pid=1179 题目描述 请统计某个给定范围[L, R]的所有整数中,数字 2 出现的次数. 比如给定范围[2, 22],数字 2 在数 2 中出现了 1 次,在数 12 中出现 1 次,在数 20 中出 现 1 次,在数 21 中出现 1 次,在数 22 中出现 2 次,所以数字 2 在该范围内一共出现了 6 次. 输入输出格式 输入格式: 输入文件名为 two.in. 输入共 1 行,为两个正整数 L 和 R,之间用一个

洛谷 P1176 路径计数2

P1176 路径计数2 题目描述 一个N×N的网格,你一开始在(1, 1),即左上角.每次只能移动到下方相邻的格子或者右方相邻的格子,问到达(N, N),即右下角有多少种方法. 但是这个问题太简单了,所以现在有M个格子上有障碍,即不能走到这M个格子上. 输入输出格式 输入格式: 输入文件第1行包含两个非负整数N,M,表示了网格的边长与障碍数. 接下来M行,每行两个不大于N的正整数x, y.表示坐标(x, y)上有障碍不能通过,且有1≤x, y≤n,且x, y至少有一个大于1,并请注意障碍坐标有可

洛谷P2879 [USACO07JAN]区间统计Tallest Cow

To 洛谷.2879 区间统计 题目描述 FJ's N (1 ≤ N ≤ 10,000) cows conveniently indexed 1..N are standing in a line. Each cow has a positive integer height (which is a bit of secret). You are told only the height H (1 ≤ H ≤ 1,000,000) of the tallest cow along with th

洛谷 P2764 LibreOJ 6002 最小路径覆盖问题

题目描述 «问题描述: 给定有向图G=(V,E).设P 是G 的一个简单路(顶点不相交)的集合.如果V 中每个顶点恰好在P 的一条路上,则称P是G 的一个路径覆盖.P 中路径可以从V 的任何一个顶点开始,长度也是任意的,特别地,可以为0.G 的最小路径覆盖是G 的所含路径条数最少的路径覆盖.设计一个有效算法求一个有向无环图G 的最小路径覆盖.提示:设V={1,2,.... ,n},构造网络G1=(V1,E1)如下: 每条边的容量均为1.求网络G1的( 0 x , 0 y )最大流. «编程任务:

洛谷1130 红牌

洛谷1130 红牌 本题地址:http://www.luogu.org/problem/show?pid=1130 题目描述 某地临时居民想获得长期居住权就必须申请拿到红牌.获得红牌的过程是相当复杂 ,一共包括N个步骤.每一步骤都由政府的某个工作人员负责检查你所提交的材料是否符合条件.为了加快进程,每一步政府都派了M个工作人员来检查材料.不幸 的是,并不是每一个工作人员效率都很高.尽管如此,为了体现“公开政府”的政策,政府部门把每一个工作人员的处理一个申请所花天数都对外界公开. 为了防止所有申请

洛谷P2420 让我们异或吧

P2420 让我们异或吧 161通过 450提交 题目提供者该用户不存在 标签洛谷原创云端↑ 难度普及/提高- 时空限制1s / 128MB 提交  讨论  题解 最新讨论更多讨论 倍增可做的吧 玄学 更改根节点得分不一样- 这题面似乎对一些群体不太友- 这题为什么没数据 C++选手注意了 题目描述 异或是一种神奇的运算,大部分人把它总结成不进位加法. 在生活中-xor运算也很常见.比如,对于一个问题的回答,是为1,否为0.那么: (A是否是男生 )xor( B是否是男生)=A和B是否能够成为情

洛谷P1547 Out of Hay 最小生成树 并查集

洛谷P1547 Out of Hay 最小生成树 并查集 路径压缩 #include <cstdio> #include <cmath> #include <cstdlib> #include <cstring> #include <string> #include <algorithm> #include <iostream> #include <iomanip> using namespace std ;