spfa()算法,思路在注释里
#include <iostream>
#include <queue>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cstdio>
using namespace std;
const int N = 10010;
struct Node{
int node; // 下一个节点
int w; // 权值
int no; // 限高杆
};
int n,m;
vector<Node> g[N]; // vector作邻接表
int d[N][3]; //d[i][j]:表示点i 且限高杆数量不超过j 的距离
bool st[N][3]; // spfa()算法
typedef pair<int,int> PII; // 点,限高杆数量
void spfa()
{
memset(d,0x3f,sizeof d);
d[1][0] = d[1][1] = d[1][2] = 0;
queue<PII> q;
q.push({1,0});
// spfa()
while(q.size())
{
auto t = q.front();
q.pop();
int idx = t.first; // 当前节点
int no = t.second; // 当前经过限高杆的数量
st[idx][no] = false;
for(int i = 0;i < g[idx].size();i ++ )
{
int j = g[idx][i].node;
int w = g[idx][i].w;
int n = g[idx][i].no;
if(no + n > 2) continue; // 过滤条件
if(d[j][no + n] > d[idx][no] + w)
{
d[j][no + n] = d[idx][no] + w;
q.push({j,no + n});
st[j][no + n] = true;
}
}
}
}
int main()
{
//cin >> n >> m;
scanf("%d%d",&n,&m);
for(int i = 0;i < m;i ++ )
{
int a,b,c,d;
//cin >> a >> b >> c >> d;
scanf("%d%d%d%d",&a,&b,&c,&d);
g[a].push_back({b,c,d});
g[b].push_back({a,c,d});
}
spfa();
//cout << d[n][0] - min(min(d[n][0],d[n][1]), d[n][2]);
printf("%d\n",d[n][0] - min(min(d[n][0],d[n][1]), d[n][2]));
return 0;
}