练习!!

这里主要需要注意的是进队的条件和dp[][]状态的控制,dp[i][j]表示到第i个城市剩余汽油为j的最小花费。

代码:

  1. #include<iostream>
  2. #include<queue>
  3. #include<cstdio>
  4. #include<cstring>
  5. #define inf 100000000
  6. #define MAXN 1200
  7. #define MAXM 1200
  8. using namespace std;
  9.  
  10. int head[MAXN],price[MAXN],dp[MAXN][120],vis[MAXN][120];
  11.  
  12. int temp,n,m;
  13.  
  14. struct Node{
  15. int v,len,next;
  16. }edge[2*MAXN*10];
  17.  
  18. struct Node1{
  19. int d;
  20. int u;
  21. int cost;
  22. Node1(int x,int y,int z)
  23. {
  24. u=x;
  25. d=y;
  26. cost=z;
  27. }
  28. friend bool operator < (Node1 a,Node1 b)
  29. {
  30. return a.cost>b.cost;
  31. }
  32. };
  33. void addEdge(int x ,int y ,int c)
  34. {
  35. edge[temp].v=x;
  36. edge[temp].len=c;
  37. edge[temp].next=head[y];
  38. head[y]=temp;
  39. temp++;
  40.  
  41. edge[temp].v=y;
  42. edge[temp].len=c;
  43. edge[temp].next=head[x];
  44. head[x]=temp;
  45. temp++;
  46. }
  47.  
  48. priority_queue<Node1> que;
  49.  
  50. int Dijstra(int s,int t,int c)
  51. {
  52. while(!que.empty())que.pop();
  53. for(int i=0;i<=n;i++)
  54. {
  55. for(int j=0;j<=c;j++)
  56. {
  57. dp[i][j]=inf;
  58. }
  59. }
  60. memset(vis,0,sizeof(vis));
  61. dp[s][0]=0;
  62. que.push(Node1(s,0,0));
  63.  
  64. while(!que.empty())
  65. {
  66. Node1 b=que.top();
  67. que.pop();
  68. int u=b.u;
  69. int d=b.d;
  70. int cost=b.cost;
  71. vis[u][d]=1;
  72. if(u==t) return cost;
  73.  
  74. if(d+1<=c&&!vis[u][d+1]&&dp[u][d+1]>dp[u][d]+price[u])
  75. {
  76. dp[u][d+1]=dp[u][d]+price[u];
  77. que.push(Node1(u,d+1,dp[u][d+1]));
  78. }
  79. for(int i=head[u];i!=-1;i=edge[i].next)
  80. {
  81. int v;
  82. v=edge[i].v;
  83. int len=edge[i].len;
  84. if(d>=len&&!vis[v][d-len]&&dp[v][d-len]>cost)
  85. {
  86. dp[v][d-len]=cost;
  87. que.push(Node1(v,d-len,cost));
  88. }
  89. }
  90. }
  91. return -1;
  92. }
  93.  
  94. int main()
  95. {
  96. while(scanf("%d%d",&n,&m)!=EOF)
  97. {
  98.  
  99. for(int i=0;i<n;i++)
  100. {
  101. scanf("%d",&price[i]);
  102. }
  103. memset(head,-1,sizeof(head));
  104. temp=0;
  105. for(int i=1;i<=m;i++)
  106. {
  107. int v,w,c;
  108. scanf("%d%d%d",&v,&w,&c);
  109. addEdge(v,w,c);
  110. }
  111.  
  112. int q;
  113. scanf("%d",&q);
  114.  
  115. while(q--)
  116. {
  117. int q1,q2,q3;
  118. scanf("%d%d%d",&q1,&q2,&q3);
  119. int ans=Dijstra(q2,q3,q1);
  120. if(ans!=-1)
  121. {
  122. printf("%d\n",ans);
  123. }
  124. else
  125. printf("impossible\n");
  126. }
  127. }
  128. return 0;
  129. }

poj 3635 带花费的Dij+head优化的更多相关文章

  1. POJ 3635 - Full Tank? - [最短路变形][手写二叉堆优化Dijkstra][配对堆优化Dijkstra]

    题目链接:http://poj.org/problem?id=3635 题意题解等均参考:POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]. 一些口胡: ...

  2. POJ 3635 Full Tank? 【分层图/最短路dp】

    任意门:http://poj.org/problem?id=3635 Full Tank? Time Limit: 1000MS   Memory Limit: 65536K Total Submis ...

  3. codeforces 449B Jzzhu and Cities (Dij+堆优化)

    输入一个无向图<V,E>    V<=1e5, E<=3e5 现在另外给k条边(u=1,v=s[k],w=y[k]) 问在不影响从结点1出发到所有结点的最短路的前提下,最多可以 ...

  4. poj 3635 Full Tank? ( bfs+dp思想 )

    Full Tank? Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5857   Accepted: 1920 Descri ...

  5. dij+堆优化

    写这个dij+堆优化的原因是有些地方卡SPFA,只能搞这个: 香甜的奶油: #include<iostream> #include<cstdio> #include<cs ...

  6. POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]

    题目链接:http://poj.org/problem?id=3635 Description After going through the receipts from your car trip ...

  7. poj 3013 Big Christmas Tree (dij+优先级队列优化 求最短)

    模板 意甲冠军:给你一个图,1始终根,每一方都有单价值,每个点都有权重新. 每个边缘的价格值 = sum(后继结点重)*单价方值. 最低价格要求树值,它构成了一棵树n-1条边的最小价值. 算法: 1. ...

  8. POJ 3171.Cleaning Shifts-区间覆盖最小花费-dp+线段树优化(单点更新、区间查询最值)

    Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4721   Accepted: 1593 D ...

  9. poj 1125 Stockbroker Grapevine (dij优化 0ms)

    #include<iostream> #include<cstdio> #include<cstring> #include<queue> #defin ...

随机推荐

  1. python列表反转

    使用reverse来让列表反转特别方便, 没事自己写了几种方式 In [59]: def reverse(nums): length = len(nums) for i in range(length ...

  2. POJ 3259 Wormholes Bellman_ford负权回路

    Description While exploring his many farms, Farmer John has discovered a number of amazing wormholes ...

  3. knockoutjs模板实现树形结构列表

    数据结构 /*数据*/ var ko_vue_data=[ { name: "总能耗", number:"0", energyone: 14410, energ ...

  4. hdu--1316--How Many Fibs?(java大数)

    How Many Fibs? Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  5. Exceptionless 本地部署踩坑记录

    仅已此文记录 Exceptionless 本地部署所遇到的问题 1.安装ElasticSearch文本 执行elasticsearch目录中的elasticsearch.bat 没有执行成功. 使用命 ...

  6. Git 深入浅出

    如果你是一个开发人员,想用上这个世界上目前最先进的分布式版本控制系统,那么,赶快开始学习吧!(耐心读下去,收获满满) Git是什么? Git是目前世界上最先进的分布式版本控制系统(没有之一). Git ...

  7. 研究分析JS中的三种逻辑语句

    JS中的三种逻辑语句:顺序.分支和循环语句. 一.顺序语句 代码规范如下:1. <script type="text/javascript"> var a = 10;  ...

  8. 采用SmartQQ 协议可制作聊天机器人

    采用.NET CORE可运行在 Linux . Windows 和 Mac OSX 平台下. SmartQQ可以: 收发文字消息 获取好友.群.讨论组.好友分组和最近会话的列表 SmartQQ不可以: ...

  9. How to enable your website to public(set up your web server at home)

    As a so exciting dream, I would like set up my owned web site which can be accessed anywhere nomatte ...

  10. WebService/WCF/WebAPI区别

    详细描述它们之间的区别,为什么这么选择,尤其是WCF vs WebAPI