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;//输出 }
好了....