前言:关于找到最短路径上经过的边有两种方法
一种是从起点出发找一次最短路径,再从终点出发找一次最短路径
另一种是在找最短路径时标记下一个点
例题1:可怜的草坪
题目描述
小C的大学很大,从寝室到食堂要走很长一段路,很多的草坪位于这些路上。大家从寝室出发时,都喜欢从走最少的路达到食堂,哪些位于最短路上的草坪都要被踩踏,小C希望你帮他算算,有多少段草坪会经常被踩踏?
输入 输入第一行,两个整数n,m。其中1为寝室,n为食堂。 接下来m行,每行三个整数a,b,c,表示有段草坪从a到b,长度为c。 输出 输出最短的距离是多少和m段草坪中有多少段经常被踩踏。
#include<bits/stdc++.h>
using namespace std;
const int INF=10005;
const int MAX_V=20005;
const int MAX_N=200005;
struct edge{
int to,cost;};
typedef pair<int,int>P;
vector<edge>G[MAX_N];
vector<edge>H[MAX_N];
int d[MAX_V],f[MAX_V];
int v;
void dijikstra(int s){
priority_queue<P,vector<P>,greater<P> >que;
fill(d,d+v,INF);