UESTC482-Charitable Exchange-bfs优先队列
1 #include <cstring> 2 #include <algorithm> 3 #include <iostream> 4 #include <queue> 5 6 using namespace std; 7 8 typedef long long LL; 9 const int maxn = 1e5+10; 10 int T,N,cnt; 11 LL M; 12 13 struct node{ 14 LL money,time; 15 node(){} 16 node(LL a,LL b){money=a;time=b;} 17 bool operator < (const node &b) const 18 {return time > b.time;} 19 }; 20 21 struct item 22 { 23 LL V,R,time; 24 item(){} 25 item(LL a,LL b,LL c){V = a;R = b;time = c;} 26 bool operator < (const item &b) const 27 {return R < b.R;} 28 }items[maxn]; 29 30 LL bfs() 31 { 32 priority_queue<node> pq; 33 node st(1,0),cur; 34 pq.push(st); 35 int i,x=1; 36 while(!pq.empty()) 37 { 38 cur = pq.top();pq.pop(); 39 if(cur.money >= M) return cur.time; 40 for(i=x;i<=cnt;i++) 41 { 42 if(cur.money < items[i].R) break; 43 if(cur.money>=items[i].R&&cur.money<items[i].V) 44 { 45 pq.push(node(items[i].V,cur.time+items[i].time)); 46 } 47 } 48 x = i; 49 } 50 return -1; 51 } 52 53 int main() 54 { 55 cin >> T; 56 for(int cas=1;cas<=T;cas++) 57 { 58 cin >> N >> M; 59 LL v,r,t; 60 cnt=1; 61 for(int i=0;i<N;i++) 62 { 63 cin >> v >> r >> t; 64 if(v==r) continue; 65 items[cnt++] = item(v,r,t); 66 } 67 sort(items+1,items+cnt+1); 68 cout << "Case #"<<cas<<": "<<bfs()<<endl; 69 } 70 }