题目大意
每个边有两个权值,length和cost
求cost之和小于给定的C的最短路长度
单向边!
额……没思路
然后去翻题解
真机智!
嗯呢
总之,dij是不需要存dis的
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
const int MAXN = 100000 + 5;
int C;
struct edge
{
int f,t,v,co;
}l[MAXN << 1];
int first[MAXN],next[MAXN << 1],tot;
void init()
{
memset(first,0xfff,sizeof(first));
tot = 0;
return;
}
void build(int f,int t,int v,int co)
{
l[++tot] = (edge){f,t,v,co};
next[tot] = first[f];
first[f] = tot;
return;
}
struct zt
{
int u,dis,cost;
bool operator < (const zt &b)const
{
return dis > b.dis;
}
};//看这里!!!
priority_queue <zt> q;
int Dijkstra(int s,int e)
{
while(!q.empty())
q.pop();
q.push((zt){s,0,0});
while(!q.empty())
{
zt x = q.top();
q.pop();
int u = x.u;
if(u == e)
return x.dis;
for(int i = first[u];i != -1;i = next[i])
{
int v = l[i].t;
if(x.cost + l[i].co <= C)//看这里!!!
q.push((zt){v,x.dis + l[i].v,x.cost + l[i].co});
}
}
return -1;
}
int n,m,s,e;
int f,t,v,co;
int main()
{
init();
scanf("%d\n%d %d",&C,&n,&m);
for(int i = 1;i <= m;i ++)
{
scanf("%d %d %d %d",&f,&t,&v,&co);
build(f,t,v,co);
}
printf("%d\n",Dijkstra(1,n));
return 0;
}