设为首页 加入收藏

TOP

hdu2962之二分+最短(二)
2014-11-23 20:10:28 来源: 作者: 【 】 浏览:8
Tags:hdu2962 二分 最短
t int MAX=1000+10; int dist[MAX],height[MAX][MAX],road[MAX][MAX]; int n,m,maxh,minl; bool mark[MAX]; bool dijkstra(int s,int t,int h){ for(int i=1;i<=n;++i){ if(height[s][i]>=h)dist[i]=road[s][i]; else dist[i]=INF; mark[i]=false; } dist[s]=INF,mark[s]=true; for(int k=1;k<=n;++k){ int point=s; for(int i=1;i<=n;++i){ if(dist[point]>dist[i] && !mark[i])point=i; } if(point == s)return false; if(point == t){minl=dist[t];maxh=h;return true;} mark[point]=true; for(int i=1;i<=n;++i){ if(!mark[i] && dist[point]+road[point][i]=h){ dist[i]=road[point][i]+dist[point]; } } } } void Init(int n){ for(int i=1;i<=n;++i){ for(int j=i+1;j<=n;++j){ road[i][j]=road[j][i]=INF; height[i][j]=height[j][i]=-INF; } } } int main(){ int a,b,l,h,left,right,mid,num=0; while(scanf("%d%d",&n,&m),n+m){ Init(n); for(int i=1;i<=m;++i){ scanf("%d%d%d%d",&a,&b,&h,&l); road[a][b]=l,height[a][b]=h; road[b][a]=l,height[b][a]=h; if(h == -1)height[a][b]=height[b][a]=INF; } scanf("%d%d%d",&a,&b,&h); left=0,right=h,maxh=-INF; while(left<=right){ mid=left+right>>1; if(dijkstra(a,b,mid))left=mid+1; else right=mid-1; } if(h == -1)dijkstra(a,b,-1); if(num)cout<

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇UVA 507 Jill Rides Again (连续.. 下一篇UVA 108 Maximum Sum(子矩阵最大..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C 内存管理 | 菜鸟教 (2025-12-26 20:20:37)
·如何在 C 语言函数中 (2025-12-26 20:20:34)
·国际音标 [ç] (2025-12-26 20:20:31)
·微服务 Spring Boot (2025-12-26 18:20:10)
·如何调整 Redis 内存 (2025-12-26 18:20:07)