3255. 行车路线 - AcWing题库
#include<bits/stdc++.h>
using namespace std;
const int N = 510, M = 200010,INF=1e6;
int n, m;
int h[N], f[M], e[M],w[M], ne[M], idx;
bool st[N][N];
int dist[N][N];
struct Node
{
int x, y, v;
bool operator < (const Node& t)const
{
return v > t.v;
}
};
void dijkstra()
{
priority_queue<Node>heap;
memset(dist,0x3f,sizeof dist);
heap.push({1,0,0});
dist[1][0] = 0;
while (heap.size())
{
auto t = heap.top();
heap.pop();
if (st[t.x][t.y])continue;
for (int i = h[t.x]; i != -1; i = ne[i])
{
int x = e[i], y = t.y;
if (f[i])
{
y += w[i];
if (y <= 1000)
{
if (dist[x][y] > t.v - t.y * t.y + y * y)
{
dist[x][y] = t.v - t.y * t.y + y * y;
if (dist[x][y] <= INF)
heap.push({x,y,dist[x][y]});
}
}
}
else
{
if (dist[x][0] > t.v + w[i])
{
dist[x][0] = t.v + w[i];
if (dist[x][0] <= INF)
heap.push({x,0,dist[x][0]});
}
}
}
}
}
void add(int t, int a, int b, int c)
{
e[idx] = b, f[idx] = t, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}
int main()
{
cin >> n >> m;
memset(h,-1,sizeof h);
while (m--)
{
int t, a, b, c; cin >> t >> a >> b >> c;
add(t,a,b,c), add(t,b,a,c);
}
dijkstra();
int res = INF;
for (int i = 0; i < 1000; i++) res = min(res,dist[n][i]);
cout << res << endl;
return 0;
}