ROADS

其实就是最短路....但我仍然WA了N次.....这道题我用了结构体,因为结构体排序比cmp快....先排长度最小,如果长度一样再排花的钱最少,再建个图,然后打板子.....

代码:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
struct str
{
    int qi_dian,zhong_dian,chang_du,money;//起点,终点,长度,钱 
}c[10002];
struct pai_xu
{
    int x,chang_du1,dang_qian_money;
    friend bool operator < (pai_xu i,pai_xu j)//排序 
    {
        if(i.chang_du1!=j.chang_du1) return i.chang_du1>j.chang_du1;
        else return i.dang_qian_money>j.dang_qian_money;
    }
};
int n,m,money_zong,hhh;
int a[10001],b[10001],ans[10001];
int main()
{
        cin>>money_zong>>n>>m;
        memset(a,0,sizeof(a));//删了也行 
        memset(b,0,sizeof(b));
        memset(ans,0,sizeof(ans));
        for(int i=1;i<=m;i++)
        {
            cin>>c[i].qi_dian>>c[i].zhong_dian>>c[i].chang_du>>c[i].money;
            a[i]=b[c[i].qi_dian];
            b[c[i].qi_dian]=i;//建图 
        }
        pai_xu k={1,0,0};//节点从一,长度从0,钱也为0 
        priority_queue<pai_xu> que;//定个队列 
        que.push(k);
        int sum=-1;//
        while(!que.empty())
        {
            k=que.top();
            que.pop();
            int t=k.x;
            if(t==n)//走到了.... 
            {
                sum=k.chang_du1;
                break;
            }
            for(int i=b[t];i;i=a[i])//然后就打板子.... 
            {
                if(c[i].money+k.dang_qian_money<=money_zong)//如果总钱数+当前钱数小于你有的钱数 
                {
                    pai_xu h;
                    h.x=c[i].zhong_dian;
                    h.chang_du1=c[i].chang_du+k.chang_du1;
                    h.dang_qian_money=c[i].money+k.dang_qian_money;//当前钱数为总钱数加上这条路走的钱数 
                    que.push(h);
                }
            }
        }
        cout<<sum<<endl;//输出 
}

好了....

posted @ 2018-08-06 09:47  DJY_01  阅读(155)  评论(0编辑  收藏  举报