hdu 2962 最短路+二分

题意:最短路上有一条高度限制,给起点和最大高度,求满足高度最大情况下,最短路的距离

不明白为什么枚举所有高度就不对

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 const int maxint=999999;
  5 int c[1005][1005][2],dist[1005],H[1005];
  6 using namespace std;
  7 int n,line;
  8 int i,j,k;
  9 int st,ed,mid;
 10 int t=0;
 11 int path[1005];
 12 int visit[1005];
 13 bool dijkstra()
 14 {
 15     bool s[1005];
 16      for(int i=1;i<=n;i++)
 17      {
 18              s[i]=0;
 19              if(c[st][i][0]>=mid)
 20                   dist[i]=c[st][i][1];
 21               else dist[i]=maxint;
 22             path[i]=st;
 23      }
 24      s[st]=1;
 25      for(int i=1;i<n;i++)
 26      {
 27          int temp=maxint;
 28          int u=st;
 29            for(int j=1;j<=n;j++)
 30                  if(!s[j]&&temp>dist[j]&&c[path[j]][j][0]>=mid)
 31                  {
 32                         temp=dist[j];
 33                         u=j;
 34                  }
 35            if(temp==maxint) break;
 36            s[u]=1;
 37            if(u==ed) return true;
 38            for(int j=1;j<=n;j++)
 39                  if(!s[j]&&c[u][j][1]!=maxint&&c[u][j][0]>=mid)
 40                       if(dist[j]>dist[u]+c[u][j][1])
 41                       {
 42                                dist[j]=dist[u]+c[u][j][1];
 43                                path[j]=u;
 44                       }
 45      }
 46    return false;
 47 }
 48 int main()
 49 {
 50        #ifndef ONLINE_JUDGE
 51         freopen("1.in","r",stdin);
 52         #endif
 53     while(scanf("%d%d",&n,&line)!=EOF&&n&&line)
 54     {
 55         int tot=1;
 56         memset(H,0,sizeof(H));
 57         H[0]=0;
 58         if(t)   printf("\n");
 59         printf("Case %d:\n",++t);
 60         for(i=1;i<=n;i++)
 61             for(j=1;j<=n;j++)
 62         {
 63             c[i][j][1]=(i==j?0:maxint);
 64             c[i][j][0]=-999999;
 65         }
 66         for(i=1;i<=line;i++)
 67         {
 68             int p,q,len,h;
 69             scanf("%d%d%d%d",&q,&p,&h,&len);
 70             if(h==-1)
 71             {
 72                 c[p][q][0]=c[q][p][0]=maxint;
 73                 c[p][q][1]=c[q][p][1]=len;
 74                 continue;
 75             }
 76             if(c[p][q][0]<h)
 77             {
 78                 c[p][q][0]=c[q][p][0]=h;
 79                 c[p][q][1]=c[q][p][1]=len;
 80             }
 81         }
 82         int tall;
 83         scanf("%d%d%d",&st,&ed,&tall);
 84         /*if(st==ed)
 85         {
 86             printf("maximum height = %d\n",tall);
 87            printf("length of shortest route = 0\n");
 88            continue;
 89         }*/
 90         /*H[tot++]=tall;
 91         sort(H,H+tot);
 92         int ans=0;
 93         bool flag=0;
 94         for(i=tot-1;i>=0;i--)
 95         {
 96             if(H[i]>tall)   continue;
 97             mid=H[i];
 98             if(dijkstra())
 99             {
100                 flag=1;
101                 ans=dist[ed];
102                 break;
103             }
104         }*/
105         int first=1;
106         int ans;
107         mid=(first+tall)>>1;
108         while(first<=tall)
109         {
110             if(dijkstra())
111             {
112                 ans=dist[ed];
113                 first=mid+1;
114             }
115             else
116                 tall=mid-1;
117             mid=(first+tall)>>1;
118         }
119         if(tall==0) printf("cannot reach destination\n");
120         else
121         {
122            printf("maximum height = %d\n",tall);
123            printf("length of shortest route = %d\n",ans);
124         }
125     }
126     return 0;
127 }
时间: 2024-11-04 22:15:11

hdu 2962 最短路+二分的相关文章

hdu 2962 Trucking (二分+最短路Spfa)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2962 Trucking Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1763    Accepted Submission(s): 618 Problem Description A certain local trucking co

hdu 2962

二分加最短路 #include <stdio.h> #include <string.h> #define N 1005 #define INF 0x3f3f3f3f struct tt{ int h,cost; }dis[N][N]; int vis[N],d[N],num =1; int dijkstral(int v0,int t,int n,int h) { int i,temp,x,y; for(i = 1 ; i <= n ; i++) { if(dis[v0][

ACM: HDU 2544 最短路-Dijkstra算法

HDU 2544最短路 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最短的从商店到赛场的路线,你可以帮助他们吗? Input 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<

hdu 4185 Oil Skimming(二分匹配)

Oil Skimming Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 883    Accepted Submission(s): 374 Problem Description Thanks to a certain "green" resources company, there is a new profitable

HDU 4417 划分树+二分

题意:有n个数,m个询问(l,r,k),问在区间[l,r] 有多少个数小于等于k. 划分树--查找区间第k大的数.... 利用划分树的性质,二分查找在区间[l,r]小于等于k的个数. 如果在区间第 i 大的数tmp>k,则往下找,如果tmp<k,往上找. #include<cstdio> #include<stdlib.h> #include<string.h> #include<string> #include<map> #incl

hdu 2112 (最短路+map)

链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112 HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 14515    Accepted Submission(s): 3405 Problem Description 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发

HDU 2544 最短路(我的dijkstra算法模板、SPAFA算法模板)

思路:这道题是基础的最短路径算法,可以拿来试一下自己对3种方法的理解 dijkstra主要是从第一个点开始枚举,每次枚举出当当前最小的路径,然后再以那最小的路径点为起点,求出它到其它未标记点的最短距离 bellman-ford 算法则是假设有向网中有n 个顶点.且不存在负权值回路,从顶点v1 和到顶点v2 如果存在最短路径,则此路径最多有n-1 条边.这是因为如果路径上的边数超过了n-1 条时,必然会重复经过一个顶点,形成回路:而如果这个回路的权值总和为非负时,完全可以去掉这个回路,使得v1到v

HDU 1281 棋盘游戏(二分匹配 与 删边)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1281 根据题目描述,什么是重要点?在求出最大匹配后,进行枚举,依次删边,看最大匹配数会不会发生改变,改变的话,那么该点就是重要点. #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <

HDU 2119 Matrix 简单二分匹配

行做x集,列做y集,1就给该行该列连一条边,输出最大匹配边即可 #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<vector> #include<set> using namespace std; #define N 105 int lef[N], pn;//lef[v]表示Y集的点v 当前连接的点 , pn为x点集的