hdu 2962(二分答案+最短路)
来源:互联网 发布:网络拉丝是什么意思 编辑:程序博客网 时间:2024/06/01 08:41
题目大意:给你城市数c,道路数r,运载车的限高h,以及每条道路的限高limit,让你求start到end的货物的最大高度res(res<=limit,res<=h),和在货物最大高度下,从start到end的最短路。
大体思路:二分答案(res∈[1.h]),然后再求最大高度下的最短路即可。具体看代码。
#include <queue>
#include <string.h>
#include <string>
#include <vector>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=1005;
struct edge{
int to;
int cost;
int height;
edge(int _to=0,int _cost=0,int _height=0):to(_to),cost(_cost),height(_height){}
};
int n,m;
vector<edge> es[maxn];
void addedge(int u,int v,int w,int h)
{
es[u].push_back(edge(v,w,h));
}
bool vis[maxn];
int cnt[maxn],dis[maxn];
void spfa(int s,int limit)
{
memset(vis,false,sizeof(vis));
memset(cnt,0,sizeof(cnt));
for(int i=1;i<=n;i++) dis[i]=inf;
for(int i=0;i<es[s].size();i++)
if(es[s][i].height<limit) dis[es[s][i].to]=inf;//道路的最大高度小于货物最大高度,即车辆不能走这条道路,那么令dis[i]=∞;
vis[s]=true;
dis[s]=0;
queue<int> que;
while(!que.empty()) que.pop();
que.push(s);
cnt[s]=1;
while(!que.empty())
{
int u=que.front();
que.pop();
vis[u]=false;
for(int i=0;i<es[u].size();i++)
{
int v=es[u][i].to;
if(dis[v]>dis[u]+es[u][i].cost&&es[u][i].height>=limit)//不满足条件就不能选择这条边
{
dis[v]=dis[u]+es[u][i].cost;
if(!vis[v])
{
vis[v]=true;
que.push(v);
if(++cnt[v]>n) break; //记录入队次数,判断负环的存在
}
}
}
}
/*return true;*/
}
int main()
{
/*freopen("1.txt","r",stdin); */
int kase=1;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=0;i<maxn;i++)
es[i]=vector<edge>(0);//vector 数组清零,坑点。
if(n==0&&m==0) break;
if(kase!=1)
printf("\n");
for(int i=0;i<m;i++)
{
int u,v,h,l;
scanf("%d%d%d%d",&u,&v,&h,&l);
if(h==-1) h=inf;
addedge(u,v,l,h);
addedge(v,u,l,h);
}
int start,end,limit;
scanf("%d %d %d",&start,&end,&limit);
int left=1,right=limit,ans=inf,res=0;
while(left<=right)
{
int mid=(left+right)/2;
spfa(start,mid);
int temp=dis[end];
if(temp!=inf)
{
left=mid+1;
ans=temp;
res=mid;
}
else{
right=mid-1;
}
}
printf("Case %d:\n",kase++);
if(ans==inf) printf("cannot reach destination\n");
else{
printf("maximum height = %d\n",res);
printf("length of shortest route = %d\n",ans);
}
}
return 0;
}
- hdu 2962(二分答案+最短路)
- 最短路 + 二分答案
- hdu 2962(最短路+二分)
- hdu 2962 Trucking(二分+最短路)
- [HDU 2692] Ball · 二分答案+最短路
- 【二分答案&&最短路】URAL
- hdu 2962 Trucking (最短路之SPFA算法 + 二分)
- HDU 2962 Trucking 最短路+二分
- 【HDU】2962 Trucking 二分+最短路
- hdu 2962 Trucking (二分+最短路Spfa)
- HDU 2962 Trucking 二分+最短路
- hdu 1839(二分+最短路)
- hdu 1839(二分+最短路)
- Poj2638 网络流+最短路+二分答案
- HDU 2962 Trucking(二分+带限制最短路)
- hdu 2363(限制最短路 二分+枚举+最短路)
- ★ HDU 3468 最短路+二分匹配
- hdu 1839 二分搜索+dijkstra最短路
- java过滤防止sql注入过滤
- 算法复习:数字在排序数组中出现的次数
- [置顶]CentOS7配置FTP服务器增强版~(零基础学会FTP配置)
- MyEclipse 选中属性或方法后 相同的不变色
- 如何用数据仓库管理海量数据?直接访问数据仓库数据时的4个限制
- hdu 2962(二分答案+最短路)
- PHP数组根据数组内的某个单元字段排序
- 深入理解Apache Flink核心技术
- -bash xxx command not found
- HTML&CSS高级课程
- Java中常用的几种DOCX转PDF方法
- java定时器的使用(Timer)
- Selenium简介
- CSP策略防止广告植入问题