【poj 1724】ROADS

来源:互联网 发布:windows 3.0 编辑:程序博客网 时间:2024/06/05 05:23

题目大意

每个边有两个权值,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;}
0 0
原创粉丝点击