CSU 1307 最短路+二分

题目大意:

帮忙找到一条a到b的最短路,前提是要保证路上经过的站点的最大距离尽可能短

这道题居然要用到二分。。。完全没去想过,现在想想求最大距离的最小值确实是。。。

这里不断二分出值代入spfa()或者dijkstla()中计算a到b的最短距离,每次都保证只经过边小于mid值的路径

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <queue>
 4 #include <cstring>
 5 #include <algorithm>
 6 using namespace std;
 7 #define N 2005
 8 #define LL long long
 9 int first[N],k,visit[N];
10 int dp[N];
11 struct Path{
12     int x,y,next,d;
13 }path[100005];
14 void add(int x,int y,int d)
15 {
16     path[k].y=y,path[k].d=d,path[k].next=first[x];
17     first[x]=k;
18     k++;
19 }
20 bool spfa(int u,int b,int mid)
21 {
22     queue<int> q;
23     memset(dp,-1,sizeof(dp));
24     memset(visit,0,sizeof(visit));
25     dp[u]=0,visit[u]=1;
26     q.push(u);
27     while(!q.empty()){
28         int v=q.front();
29         q.pop();
30         visit[v]=0;
31         for(int i=first[v];i!=-1;i=path[i].next){
32             int t=path[i].y;
33             if(path[i].d<=mid&&(dp[t]>dp[v]+path[i].d||dp[t]<0)){
34                 dp[t]=dp[v]+path[i].d;
35                 if(!visit[t]) visit[t]=1,q.push(t);
36             }
37         }
38     }
39     return dp[b]!=-1;
40 }
41 int main()
42 {
43     int n,m,a,b,u,v,w;
44     while(scanf("%d%d%d%d",&n,&m,&a,&b)!=EOF){
45         memset(first,-1,sizeof(first));
46         k=0;
47         for(int i=0;i<m;i++){
48             scanf("%d%d%d",&u,&v,&w);
49             add(u,v,w);
50             add(v,u,w);
51         }
52         int st=0,la=10000,mid,ans;
53         while(st<=la){
54             mid=(st+la)/2;
55             if(spfa(a,b,mid)) ans=dp[b],la=mid-1;
56             else st=mid+1;
57         }
58         printf("%d\n",ans);
59     }
60     return 0;
61 }

CSU 1307 最短路+二分

时间: 2024-10-30 04:37:38

CSU 1307 最短路+二分的相关文章

CSU 1307

1307: City Tour Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 549  Solved: 124[Submit][Status][Web Board] Description Alice想要从城市A出发到城市B,由于Alice最近比较穷(不像集训队陈兴老师是个rich second),所以只能选择做火车从A到B.不过Alice很讨厌坐火车,火车上人比较多,比较拥挤,所以Alice有很严格的要求:火车的相邻两站间的最大距离尽可能的短,这

HDU1839_Delay Constrained Maximum Capacity Path(最短路+二分)

解题报告 http://blog.csdn.net/juncoder/article/details/38349019 题目传送门 题意: 有N个点,点1为珍贵矿物的采矿区, 点N为加工厂,有M条双向连通的边连接这些点.走每条边的运输容量为C,运送时间为D. 他们要选择一条从1到N的路径运输, 这条路径的运输总时间要在T之内,在这个前提之下,要让这条路径的运输容量尽可能地大. 一条路径的运输容量取决与这条路径中的运输容量最小的那条边. 思路: 二分容量建图,spfa判时间是否符合条件 #incl

POJ 3662 Telephone Lines【Dijkstra最短路+二分求解】

Telephone Lines Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7214   Accepted: 2638 Description Farmer John wants to set up a telephone line at his farm. Unfortunately, the phone company is uncooperative, so he needs to pay for some of

LightOJ 1307 Counting Triangles 二分查找

[题解整理]二分题 题目类型: 二分查找: 二分答案. 大致解题思路: 查找注意有序和返回值: 浮点数注意精度: 整数注意返回值,建议另外维护一个变量,用于储存可行解. 题目 分类 传送门 WA点 poj 2785 二分查找 题解 lightoj 1088 二分查找 题解 lightoj 1307 二分查找 题解 longlong poj 2456 整数二分答案 题解 poj 3104 整数二分答案 题解 poj 3258 整数二分答案 题解 poj 3273 整数二分答案 题解 lightoj

hdu2962 Trucking (最短路+二分查找)

Problem Description A certain local trucking company would like to transport some goods on a cargo truck from one place to another. It is desirable to transport as much goods as possible each trip. Unfortunately, one cannot always use the roads in th

hdu2962(最短路+二分)

题意:在最大的高度下面求最短路,由于题目给出限高,所以我们只需要二分高度然后用SPFA #include <iostream> #include <string.h> #include <queue> #include <vector> #include <utility> #include <cstdio> #include <cstring> #include <algorithm> using names

hdu 2962 Trucking 最短路+二分。。Dijkstra+SPFA两种算法实现。

Trucking Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1966    Accepted Submission(s): 680 Problem Description A certain local trucking company would like to transport some goods on a cargo

poj3662 最短路+二分

1 //Accepted 508 KB 79 ms 2 //spfa+二分 3 //二分需要的花费cost,把图中大于cost的边设为1,小于cost的边设为0,然后spfa求 4 //最短路,如果小于K则可行,继续二分 5 #include <cstdio> 6 #include <cstring> 7 #include <iostream> 8 #include <queue> 9 #include <cmath> 10 #include &

POJ3662Telephone Lines(最短路+二分)

传送门 题目大意:n个点p条边,每条边有权值,让1和n点联通,可以将联通1--n的边选k条免费, 求剩下边权的最大值. 题解:二分一个答案x,大于x的边权设为1,小于等于x的边权设为0,跑最短路. 若从1到n的最短路dis[n]<=k,则可以通过免费k条边,答案为x. 代码: #include<iostream> #include<cstdio> #include<queue> #include<cstring> #include<algorit