题目大意:就是给定起始点和结束点以及卡车的重量,问你在保证卡车重量最大的前提下,最短路径是多少,我们可以枚举卡车的重量,在对每个卡车的重量进行dijkstra,算到终点是否存在最短路径。当然枚举也可以用二分进行优化,时间差的还是蛮多的。
2016-08-05 15:23:00 | Accepted | 2962 | 9297MS | 9500K | 2257 B | G++ |
2016-08-05 15:34:54 | Accepted | 2962 | 1606MS | 9496K | 2516 B | G++ |
下面那个是进行过二分优化的。
//二分+dijkstra #include<iostream> #include<cstdio> #include<cstring> using namespace std; #define INF 0x3f3f3f3f int n,m,ch,h,l,c,r,s,e,ans1,ans2; bool visited[1005]; int a[1005][1005],height[1005][1005]; int dist[1005]; int hei[1005]; void dijkstra(int he) { memset(visited,false,sizeof(visited)); memset(dist,0x3f,sizeof(dist)); visited[s]=true; for(int i=1;i<=n;i++) { hei[i]=height[s][i]; if(hei[i]<he) dist[i]=INF; else dist[i]=a[s][i]; } for(int i=1;i<=n;i++) { int MIN=INF,node=-1; for(int j=1;j<=n;j++) { if(!visited[j]&&dist[j]<MIN&&hei[j]>=he) { MIN=dist[j]; node=j; } } if(node==-1) return; visited[node]=true; for(int j=1;j<=n;j++) { if(!visited[j]&&height[node][j]>=he&&dist[j]>dist[node]+a[node][j]) { dist[j]=dist[node]+a[node][j]; hei[j]=height[node][j]; } } } } int main() { int sym=0; while(true) { sym++; ans1=-1; ans2=-1; memset(a,0x3f,sizeof(a)); memset(height,0,sizeof(height)); scanf("%d%d",&n,&m); if(n==0&&m==0) break; for(int i=0;i<m;i++) { scanf("%d%d%d%d",&l,&r,&h,&c); a[l][r]=a[r][l]=c; if(h==-1) height[l][r]=height[r][l]=INF; else height[l][r]=height[r][l]=h; } for(int i=1;i<=n;i++) { a[i][i]=height[i][i]=0; } scanf("%d%d%d",&s,&e,&ch); int left=1; int right=ch; int mid=0; while(left<=right) { mid=(left+right)/2; dijkstra(mid); if(dist[e]!=INF) { ans1=dist[e]; ans2=mid; left=mid+1; } else right=mid-1; } if(sym!=1) printf("\n"); printf("Case %d:\n",sym); if(ans1==-1&&ans2==-1) { printf("cannot reach destination\n"); } else { printf("maximum height = %d\n",ans2); printf("length of shortest route = %d\n",ans1); } } return 0; } //枚举+dijkstra #include<iostream> #include<cstdio> #include<cstring> using namespace std; #define INF 0x3f3f3f3f int n,m,ch,h,l,c,r,s,e; bool visited[1005]; int a[1005][1005],height[1005][1005]; int dist[1005]; int hei[1005]; void dijkstra(int he) { memset(visited,false,sizeof(visited)); memset(dist,0x3f,sizeof(dist)); visited[s]=true; for(int i=1;i<=n;i++) { hei[i]=height[s][i]; if(hei[i]<he) dist[i]=INF; else dist[i]=a[s][i]; } for(int i=1;i<=n;i++) { int MIN=INF,node=-1; for(int j=1;j<=n;j++) { if(!visited[j]&&dist[j]<MIN&&hei[j]>=he) { MIN=dist[j]; node=j; } } if(node==-1) return; visited[node]=true; for(int j=1;j<=n;j++) { if(!visited[j]&&height[node][j]>=he&&dist[j]>dist[node]+a[node][j]) { dist[j]=dist[node]+a[node][j]; hei[j]=height[node][j]; } } } } int main() { int sym=0; while(true) { sym++; memset(a,0x3f,sizeof(a)); memset(height,0,sizeof(height)); scanf("%d%d",&n,&m); if(n==0&&m==0) break; for(int i=0;i<m;i++) { scanf("%d%d%d%d",&l,&r,&h,&c); a[l][r]=a[r][l]=c; if(h==-1) height[l][r]=height[r][l]=INF; else height[l][r]=height[r][l]=h; } for(int i=1;i<=n;i++) { a[i][i]=height[i][i]=0; } scanf("%d%d%d",&s,&e,&ch); while(ch!=0) { dijkstra(ch); if(dist[e]!=INF) { break; } ch--; } if(sym!=1) printf("\n"); printf("Case %d:\n",sym); if(ch==0) { printf("cannot reach destination\n"); } else { printf("maximum height = %d\n",ch); printf("length of shortest route = %d\n",dist[e]); } } return 0; }
相关推荐
《最短路问题详解》 在计算机科学领域,最短路问题是一个经典的图论问题,其目标是寻找网络中两点间路径的最小成本。这个问题在众多应用中都有所体现,如交通规划、通信网络设计、社交网络分析等。在本篇内容中,...
描述中提到的"求多源点到单终点的最短路(反向建图)"进一步说明了问题的核心是找到从多个起点到一个固定终点的最短路径,并且采用了“反向建图”的策略。 在图论中,最短路径问题是一个经典问题,通常我们使用 ...
最短路径 贪心实现代码 hdu 最短路 dijkstra 算法
HDU实验板操作手册-STM32F1031主要涵盖了四个关键部分,旨在帮助用户熟悉并有效地使用基于STM32F1031的开发板进行嵌入式系统开发。以下是各部分的详细说明: 1. **开发板外观说明** 开发板设计紧凑,左侧和上侧...
- **解题思路**:构建二分图模型,使用二分法优化最大匹配算法,同时结合最短路算法求解。 33. **Adopt or not (HDU 3517)** - **知识点**:最大独立集问题。 - **解题思路**:构建二分图模型,使用贪心算法或...
- **【HDU 2853】Mining Station on the Sea**:题目中的“最短路+KM”可能是指Dijkstra算法与KMP的结合,解决最短路径问题并涉及字符串匹配。 - **【HDU 3315】Assignment 求 KM 最大时,要求改动最少**、**【HDU ...
【总模板_lsy_WF[2015-04-16]1】这份文档主要涵盖的是ACM-ICPC竞赛中的图论算法模板,包括了生成树、最短路、欧拉回路和范围最值查询(RMQ)等核心概念。以下是这些知识点的详细说明: **一、生成树** 生成树是图...
1. 逻辑短路:在C/C++等语言中,逻辑运算符`&&`和`||`具有短路特性,即如果`&&`左侧为假,则不会评估右侧;如果`||`左侧为真,也不会评估右侧。 2. while循环:while循环会一直执行循环体,直到条件变为假。 3. ...
2.18.1 HDU4656 卷积取模 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 2.19 其它公式 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 2.19.1 Polya . . . ....