首页 > 其他 > 详细

[2016-04-08][POJ][3159][Candies]

时间:2016-04-08 19:32:23      阅读:225      评论:0      收藏:0      [点我收藏+]
  • 时间:2016-04-08 18:05:09 星期五

  • 题目编号:[2016-04-08][POJ][3159][Candies]

  • 题目大意:n个小孩,m条信息,每条信息a ,b ,c,表示b小孩得到的糖不能比a小孩c个,问n小孩比1小孩最多能多多少个,

  • 分析:直接就是求1到n的最短路(如果不是最短路,那么其他边,总有一种情况不能满足最短路这条边的情况,),直接跑一次Dijkstra

  • 遇到的问题:使用’vector’存图TLE了,改成用数组实现的邻接表才A

  1. #include <queue>
  2. #include <algorithm>
  3. #include <cstring>
  4. #include <cstdio>
  5. using namespace std;
  6. const int maxn = 3 * 1E4 + 10;
  7. const int maxe = 15 * 1E4 + 10;
  8. int mhead[maxn],nxt[maxe],mend[maxe],mcost[maxe],q;
  9. int vis[maxn],d[maxn];
  10. inline void addedge(int from,int to,int c){
  11. mend[q] = to;
  12. nxt[q] = mhead[from];
  13. mcost[q] = c;
  14. mhead[from] = q++;
  15. }
  16. inline void ini(){
  17. memset(mhead,-1,sizeof(mhead));
  18. q = 2;
  19. }
  20. struct mNode{
  21. int u,c;
  22. mNode(int _u = 0,int _c = 0):u(_u),c(_c){}
  23. bool operator < (const mNode & a)const{
  24. return c > a.c;
  25. }
  26. };
  27. void Dijkstra(int s){
  28. memset(vis,0,sizeof(vis));
  29. memset(d,0x3f,sizeof(d));
  30. priority_queue<mNode> q;
  31. d[s] = 0;
  32. q.push(mNode(s,0));
  33. mNode tmp;
  34. while(!q.empty()){
  35. tmp = q.top();
  36. q.pop();
  37. int u = tmp.u;
  38. if(vis[u]) continue;
  39. vis[u] = 1;
  40. for(int e = mhead[u];~e;e = nxt[e]){
  41. int v = mend[e];
  42. if(!vis[v] && d[v] > d[u] + mcost[e]){
  43. d[v] = d[u] + mcost[e];
  44. q.push(mNode(v,d[v]));
  45. }
  46. }
  47. }
  48. }
  49. int main(){
  50. int n,m,a,b,c;
  51. ini();
  52. scanf("%d%d",&n,&m);
  53. for(int i = 0 ; i < m ; ++i){
  54. scanf("%d%d%d",&a,&b,&c);
  55. addedge(a,b,c);
  56. }
  57. Dijkstra(1);
  58. printf("%d\n",d[n]);
  59. return 0;
  60. }




[2016-04-08][POJ][3159][Candies]

原文:http://www.cnblogs.com/qhy285571052/p/f5da40a5aeeb1b1ab3ae29bf50c9e811.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!