Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2216 Accepted Submission(s): 757
Case 1:
maximum height = 7
length of shortest route = 20
Case 2:
maximum height = 4
length of shortest route = 8
Case 3:
cannot reach destination
题意:给定一个无向图,每条边有长度,通过最大高度两个权值,求解从起点到终点的能通过的最大高度以及在此高度上的最短路径长度
思路:二分搜索,每次进行一次最短路算法Dijkstra,路径更新公式需要添加 map[i][v].h>=p||map[i][v].h==-1
需要注意最后一行不能输出\n PE了两次
1 #include <cstring> 2 #include <iostream> 3 #include <algorithm> 4 #include <cstdio> 5 using namespace std; 6 #define Max 1005 7 #define INF 9999999 8 struct node 9 { 10 int len,h; 11 }map[Max][Max]; 12 bool vis[Max]; 13 int dis[Max]; 14 int c,r; 15 int s,e,height; 16 17 bool Dijkstra(int p) 18 { 19 int i,j; 20 memset(vis,0,sizeof(vis)); 21 for(i=0;i<=c;i++) 22 dis[i]=INF; 23 dis[s]=0; 24 while(true) 25 { 26 int v=0; 27 for(i=1;i<=c;i++) 28 { 29 if(!vis[i]&&(v==0||dis[i]<dis[v])) 30 v=i; 31 } 32 if(v==0) 33 break; 34 vis[v]=1; 35 //cout<<v<<endl; 36 // cout<<"3 "<<dis[3]<<endl; 37 for(i=1;i<=c;i++) 38 { 39 if(vis[i]==0&&(map[i][v].h>=p||map[i][v].h==-1)&&(dis[v]+map[i][v].len<dis[i])) 40 dis[i]=dis[v]+map[i][v].len; 41 } 42 } 43 return dis[e]!=INF; 44 } 45 46 int main() 47 { 48 int i,j; 49 int a,b; 50 int t=1; 51 freopen("in.txt","r",stdin); 52 while(scanf("%d%d",&c,&r)) 53 { 54 if(c==0&&r==0) 55 break; 56 for(i=0;i<=c;i++) 57 for(j=0;j<=c;j++) 58 { 59 map[i][j].h=0; 60 map[i][j].len=INF; 61 } 62 for(i=0;i<r;i++) 63 { 64 scanf("%d%d",&a,&b); 65 scanf("%d%d",&map[a][b].h,&map[a][b].len); 66 map[b][a].h=map[a][b].h; 67 map[b][a].len=map[a][b].len; 68 } 69 scanf("%d%d%d",&s,&e,&height); 70 int lb=0,rb=height+1,mid,ans,length=INF; 71 while(rb-lb>1) 72 { 73 mid=(rb+lb)/2; 74 if(Dijkstra(mid)) 75 { 76 length=dis[e]; 77 ans=mid; 78 lb=mid; 79 } 80 else 81 rb=mid; 82 } 83 if(t!=1) 84 printf("\n"); 85 if(length==INF) 86 printf("Case %d:\ncannot reach destination\n",t++); 87 else 88 { 89 printf("Case %d:\n",t++); 90 printf("maximum height = %d\n",ans); 91 printf("length of shortest route = %d\n",length); 92 } 93 } 94 }
原文:http://www.cnblogs.com/a1225234/p/5295277.html