hdu 2363(最短路+枚举)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2363
思路:和之前hdu上做过的一题很像。。。就是先求求出所有的高度差,排序后枚举,每次都一次spfa,求出dist,若dist[n]!=inf,说明是在最小高度差下找到了最短路径,直接break即可。。。另外,发现若不用visited[]标记的话,时间是其两倍。。。orz....以后还是老老实实加visited [] 吧。。。
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(最短路+枚举)相关推荐
- Hdu 1217 最短路.cpp
题意: 各国的汇率兑换.. 给出各国之间汇率兑换的比例,然后问你是否可以通过不断地兑换最后挣钱.. 譬如美金兑换英镑 是0.5 英镑兑换法币是 10 法币兑换美金是 0.21 所以通过1美金兑换成0. ...
- hdu 4309(最大流+枚举状态)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4309 思路:2^12枚举修复哪些桥,不修复的桥没有花费,连接的边流量为1,要修复的桥则计算花费,边的流 ...
- hdu 2112 HDU Today 最短路(Dijkstra算法)
HDU Today Time Limit: 15000/5000 MS ...
- hdu 2544 最短路 (dijkstra)
http://acm.hdu.edu.cn/showproblem.php?pid=2544 最简单的最短路了吧 改天试试优化版本的 #include<stdio.h> #include& ...
- hdu 2962 最短路+二分
题意:最短路上有一条高度限制,给起点和最大高度,求满足高度最大情况下,最短路的距离 不明白为什么枚举所有高度就不对 1 #include<cstdio> 2 #include<cst ...
- HDU 2544 最短路(各种最短路算法的实现)
链接: http://acm.hdu.edu.cn/showproblem.php?pid=2544 题目: Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂 ...
- UVALive 6885 Flowery Trails 最短路枚举
题目连接: http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=129723 题意: 给你一个n点m图的边 1到n有多条最短路 ...
- HDU2112 HDU Today 最短路+字符串哈希
HDU Today Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDU_2112 HDU Today—最短路(Dijkstra)
点击这里 你便可以亲身去HDU体验一下 先看题目: HDU Today Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/3 ...
最新文章
- log4j无法打印日志的问题
- 文件共享之Samba
- egg前面加什么_国威说阀:阀门前面为什么加国标美标日标之类的?
- linux-basic(13)学习shell script
- CodeForces - 888C K-Dominant Character 思维
- 在freemarker中使用jsp标签 Using FreeMarker with servlets
- 巧妇难为无米之炊 走出软件测试的困境
- 【生活相关】四(C++编程开发学习的50条建议)
- mysql索引数据结构图解_一步一步推导MySQL索引隐秘的底层数据结构
- WIN32_FIND_DATA详解
- 《游戏程序设计模式》 2.2 - 游戏循环
- 走进中关村软件园-光环敏捷PMI-ACP落地分享会
- 通过3dmax将max文件导出为unity3d可用的带贴图的fbx文件
- java身份证号码验证
- 核心交换机、汇聚交换机、接入交换机功能详解
- 配置软件仓库 Yum/dnf
- [LeetCode]89.Gray Code
- 腾讯云找回自己用过的ip
- Linux如何终止D状态的进程
- 最常见的解决方法:error:C2059 语法错误:“using namespace”
热门文章
- Android 自定义ViewPager设置屏蔽左右滑动事件
- mysql基础综述(四)
- Mr.J-- jQuery学习笔记(二十一)--模拟微博页面
- 在.net core程序中使用EntityFrameok(非EF Core)
- org.apache.http.NoHttpResponseException
- datasnap 的HTTP 调用返回JSON
- Bootstrap 组件之 Nav
- 浅析概率中的频率学派观点和贝叶斯学派观点
- C#实现浮动和多标签窗体解决方案---使用Dockpanel
- hdu 2222 Keywords Search AC自动机——多串匹配