比赛 寒假集训2 评测结果 WAAWAWWAAAWAAAAAAAAA
题目名称 回家路线 最终得分 75
用户昵称 ChenBp 运行时间 1.580 s
代码语言 C++ 内存使用 7.50 MiB
提交时间 2026-02-25 12:03:36
显示代码纯文本
#include <iostream>
#include <queue>
#include <vector>
#include <utility>
#include <cstring>
using namespace std;
const int N=1e5+5;
int n,m,A,B,C;
struct node {
	int y,p,q;
};
vector<node>ve[N];
int dis[N];
bool vis[N];
int main() {
    freopen("rout.in","r",stdin);
    freopen("rout.out","w",stdout);
	cin>>n>>m>>A>>B>>C;
	for(int i=1; i<=m; i++) {
		int x,y,p,q;
		cin>>x>>y>>p>>q;
		ve[x].push_back({y,p,q});
	}
	memset(dis,0x3f,sizeof(dis));
	dis[1]=0;
	if(A==0&&B==0&&C==0) {
	    priority_queue<pair<int,int>>p;
	    p.push(make_pair(0,1));
		while(!p.empty()) {
			auto now=p.top();
			p.pop();
			int u=now.second;
			if(vis[u]) continue;
			vis[u]=1;
			for(auto i:ve[u]) {
				if(i.p<dis[u]) continue;
				int v=i.y;
				if(i.q<dis[v]) {
					dis[v]=i.q;
					p.push(make_pair(-dis[v],v));
				}
			}
		}
		cout<<dis[n];
		return 0;
	}
	priority_queue<pair<pair<int,int>,int>>p;
	p.push(make_pair(make_pair(0,0),1));
	while(!p.empty()) {
		auto now=p.top();
		p.pop();
		int u=now.second,t=-now.first.second;
		if(vis[u]) continue;
		vis[u]=1;
		for(auto i:ve[u]) {
			if(i.p<t) continue;
			int v=i.y;
			int d=i.p-t;
			int x=A*d*d+B*d+C;
			x+=i.q-t;
			if(dis[u]+x<dis[v]) {
				dis[v]=dis[u]+x;
				p.push(make_pair(make_pair(-dis[v],-i.q),v));
			}
		}
	}
	cout<<dis[n];
	return 0;
}