hdu1839 spfa+二分查找
来源:互联网 发布:知乎 高中生 编辑:程序博客网 时间:2024/06/05 03:54
这个题~~~~当时没做出,看了别人才慢慢理解的;
题意讲的是给定一个时间 求从1到n点花费的在那个给定时间内c最小的值。
输入输出:t组数据
第二行是 n个点m条边 t是时间限制。
后面的m行是 从a到b的重量为c,花费的时间为x;
就是求在规定限制时间内,求得一跳路的上的重量最小,但是跟其他路比起来这个重量最大。
思路:
先给容器排序,然后再建立图,然后从*******第一条******边开始遍历,满足从1到n点求最短路但是最短路的每条边都大于等于这条边,当枚举到不能到达n的时候就是这条边的上一条边就是答案,但是这里的边太多了,只能二分这样子就快一点,这就是为什么要使用二分的原因~~~~~~~~
代码:
#include<stdio.h>#include<string.h>#include<stdlib.h>#include<vector>#include<algorithm>#include<queue>using namespace std;#define INF 0x3f7f7f7f7f7f7f7f#define MAX 50001struct edge{int from,to,c,w;};vector<edge>edges;vector<int>G[MAX];int n,m,k;long long int dis[MAX];bool comp(const edge &a, const edge&b){ return a.c < b.c; //<升序,>降序 } bool SPFA(int limt) { for(int i=1;i<=n;i++) { dis[i]=INF; } dis[1]=0; queue<int>q; q.push(1); int a,b; while(!q.empty()) { a=q.front(); q.pop(); for(int i=0;i<G[a].size();i++) { edge v=edges[G[a][i]]; if(dis[a]+v.w<dis[v.to]&&v.c>=limt&&dis[a]+v.w<=k)//加入限制条件 { dis[v.to]=dis[a]+v.w; q.push(v.to); } } } if(dis[n]==INF) return 0; return 1; }int main(){ int t; scanf("%d",&t); while(t--) { scanf("%d %d %d",&n,&m,&k); for(int i=1;i<=n;i++) G[i].clear(); edges.clear(); for(int i=1;i<=m;i++) { edge b; scanf("%d %d %d %d",&b.from,&b.to,&b.c,&b.w); edges.push_back(b); int t; t=b.from,b.from=b.to,b.to=t; edges.push_back(b); } sort(edges.begin(),edges.end(),comp);//给vector容器排序 for(int i=0;i<edges.size();i++) { G[edges[i].from].push_back(i);//排序后重新建立图 } int l=0,r=m*2,mid,limt; long long int ans; while(l<=r) { mid=(l+r)/2; limt=edges[mid].c; if(SPFA(limt)) {l=mid+1;ans=limt;}//二分开始枚举。 else r=mid-1; } printf("%lld\n",ans); }}
阅读全文
0 0
- hdu1839 spfa+二分查找
- HDU1839---Delay Constrained Maximum Capacity Path(SPFA+vector+二分)
- hdu1839—Delay Constrained Maximum Capacity Path(spfa+二分)
- hdu1839 二分+最短路
- hdu1839 二分最短路
- HDU1839(最短路+二分)
- HDU1839
- HDU1839
- 二分查找+spfa(洛谷1948 [USACO08JAN]电话线Telephone Lines)
- hdu1839之二分+邻接表+Dijkstra+队列优化
- 二分+SPFA
- poj 3621 二分+spfa
- HDU 2962(SPFA+二分)
- 二分+SPFA--poj3662
- hdu2962 二分 + spfa
- poj3662 二分+spfa
- uva11090(二分spfa)
- poj3621 二分+spfa
- oracle
- Ohana Cleans Up
- css背景
- javaweb文件上传的九大问题
- python csv模块使用
- hdu1839 spfa+二分查找
- Spark编程之基本的RDD算子之zip,zipPartitions,zipWithIndex,zipWithUniqueId
- 深度优先搜索
- java中instanceof和isInstance
- C++_Seqlist/Linklist
- POJ3259 解题报告
- 2017ICPCECIC
- 同步、异步、阻塞、非阻塞的理解
- JavaWeb——文件上传和下载.