题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2363

思路:和之前hdu上做过的一题很像。。。就是先求求出所有的高度差,排序后枚举,每次都一次spfa,求出dist,若dist[n]!=inf,说明是在最小高度差下找到了最短路径,直接break即可。。。另外,发现若不用visited[]标记的话,时间是其两倍。。。orz....以后还是老老实实加visited [] 吧。。。

View Code

 1 #include<iostream>
 2 #include<queue>
 3 #include<vector>
 4 #include<algorithm>
 5 const int MAXN=110;
 6 const int inf=1<<30;
 7 using namespace std;
 8 struct Node{
 9     int v,w;
10 };
11 vector<Node>mp[MAXN];
12 struct Point{
13     int low,high;
14 }H[MAXN*MAXN];
15
16 int h[MAXN];
17 int dist[MAXN];
18 bool visited[MAXN];
19 int n,m;
20
21 int cmp(const Point &p,const Point &q){
22     return (p.high-p.low)<(q.high-q.low);
23 }
24
25
26 void SPFA(int low,int high){
27     for(int i=1;i<=n;i++)dist[i]=inf;
28     dist[1]=0;
29     memset(visited,false,sizeof(visited));
30     queue<int>Q;
31     Q.push(1);
32     while(!Q.empty()){
33         int u=Q.front();
34         Q.pop();
35         visited[u]=false;//出队列要要置为false,因为有可能再次进队列
36         if(h[u]<low||h[u]>high)continue;//起点要限制
37         for(int i=0;i<mp[u].size();i++){
38             int v=mp[u][i].v;
39             int w=mp[u][i].w;
40             //高度限制
41             if(h[v]>=low&&h[v]<=high
42                 &&dist[u]+w<dist[v]){
43                     dist[v]=dist[u]+w;
44                     if(!visited[v]){
45                         Q.push(v);
46                         visited[v]=true;
47                     }
48             }
49         }
50     }
51 }
52
53 int main(){
54     int _case;
55     scanf("%d",&_case);
56     while(_case--){
57         scanf("%d%d",&n,&m);
58         for(int i=1;i<=n;i++)mp[i].clear();
59         memset(H,0,sizeof(H));
60         memset(h,0,sizeof(h));
61         for(int i=1;i<=n;i++){
62             scanf("%d",&h[i]);
63         }
64         for(int i=1;i<=m;i++){
65             int u,v,w;
66             scanf("%d%d%d",&u,&v,&w);
67             Node p1,p2;
68             p1.v=u,p2.v=v;
69             p1.w=p2.w=w;
70             mp[u].push_back(p2);
71             mp[v].push_back(p1);
72         }
73         int k=0;
74         for(int i=1;i<=n;i++){
75             for(int j=i;j<=n;j++){
76                 H[k].low=min(h[i],h[j]);
77                 H[k++].high=max(h[i],h[j]);
78             }
79         }
80         sort(H,H+k,cmp);
81         int i=0;
82         while(i<k){
83             SPFA(H[i].low,H[i].high);
84             if(dist[n]!=inf){
85                 break;
86             }
87             i++;
88         }
89         printf("%d %d\n",H[i].high-H[i].low,dist[n]);
90     }
91     return 0;
92 }

转载于:https://www.cnblogs.com/wally/archive/2013/04/14/3020010.html

hdu 2363(最短路+枚举)相关推荐

  1. Hdu 1217 最短路.cpp

    题意: 各国的汇率兑换.. 给出各国之间汇率兑换的比例,然后问你是否可以通过不断地兑换最后挣钱.. 譬如美金兑换英镑 是0.5 英镑兑换法币是 10 法币兑换美金是 0.21 所以通过1美金兑换成0. ...

  2. hdu 4309(最大流+枚举状态)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4309 思路:2^12枚举修复哪些桥,不修复的桥没有花费,连接的边流量为1,要修复的桥则计算花费,边的流 ...

  3. hdu 2112 HDU Today 最短路(Dijkstra算法)

    HDU Today                                                                 Time Limit: 15000/5000 MS ...

  4. hdu 2544 最短路 (dijkstra)

    http://acm.hdu.edu.cn/showproblem.php?pid=2544 最简单的最短路了吧 改天试试优化版本的 #include<stdio.h> #include& ...

  5. hdu 2962 最短路+二分

    题意:最短路上有一条高度限制,给起点和最大高度,求满足高度最大情况下,最短路的距离 不明白为什么枚举所有高度就不对 1 #include<cstdio> 2 #include<cst ...

  6. HDU 2544 最短路(各种最短路算法的实现)

    链接: http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目: Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂 ...

  7. UVALive 6885 Flowery Trails 最短路枚举

    题目连接: http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=129723 题意: 给你一个n点m图的边 1到n有多条最短路 ...

  8. HDU2112 HDU Today 最短路+字符串哈希

    HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  9. HDU_2112 HDU Today—最短路(Dijkstra)

    点击这里 你便可以亲身去HDU体验一下 先看题目: HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/3 ...

最新文章

  1. log4j无法打印日志的问题
  2. 文件共享之Samba
  3. egg前面加什么_国威说阀:阀门前面为什么加国标美标日标之类的?
  4. linux-basic(13)学习shell script
  5. CodeForces - 888C K-Dominant Character 思维
  6. 在freemarker中使用jsp标签 Using FreeMarker with servlets
  7. 巧妇难为无米之炊 走出软件测试的困境
  8. 【生活相关】四(C++编程开发学习的50条建议)
  9. mysql索引数据结构图解_一步一步推导MySQL索引隐秘的底层数据结构
  10. WIN32_FIND_DATA详解
  11. 《游戏程序设计模式》 2.2 - 游戏循环
  12. 走进中关村软件园-光环敏捷PMI-ACP落地分享会
  13. 通过3dmax将max文件导出为unity3d可用的带贴图的fbx文件
  14. java身份证号码验证
  15. 核心交换机、汇聚交换机、接入交换机功能详解
  16. 配置软件仓库 Yum/dnf
  17. [LeetCode]89.Gray Code
  18. 腾讯云找回自己用过的ip
  19. Linux如何终止D状态的进程
  20. 最常见的解决方法:error:C2059 语法错误:“using namespace”

热门文章

  1. Android 自定义ViewPager设置屏蔽左右滑动事件
  2. mysql基础综述(四)
  3. Mr.J-- jQuery学习笔记(二十一)--模拟微博页面
  4. 在.net core程序中使用EntityFrameok(非EF Core)
  5. org.apache.http.NoHttpResponseException
  6. datasnap 的HTTP 调用返回JSON
  7. Bootstrap 组件之 Nav
  8. 浅析概率中的频率学派观点和贝叶斯学派观点
  9. C#实现浮动和多标签窗体解决方案---使用Dockpanel
  10. hdu 2222 Keywords Search AC自动机——多串匹配