hdu 2962 dijkstra+二分

#include <iostream>
using namespace std;

const int MAXN = 1010;
struct MAP
{
 int height, dist;
}map[MAXN][MAXN];

int hash[MAXN], dis[MAXN];
int low, high, mid;
int result, qq;
void dijkstra(int start, int end, int n, int max_height)
{
 int i, j, min, now;
 low = 0;
 high = max_height;
 while (low <= high)
 {
  memset(dis, -1, sizeof(dis));
  mid = (low + high)/2;
  for (i = 1; i <= n; ++i)
  {
   if (map[i][start].height >= mid || map[i][start].height == -1)
   {
    dis[i] = map[i][start].dist;
   }
   hash[i] = 0;
  }
  hash[start] = 1;
  
  for (i = 1; i < n; ++i)
  {
   min = 0XFFFFFFF;
   for (j = 1; j <= n; ++j)
   {
    if (!hash[j] && dis[j] != -1 && dis[j] < min)
    {
     min = dis[j];
     now = j;
    }
   }
   if (min == 0XFFFFFFF)
   {
    high = mid - 1;
    continue;
   }
   if (now == end)
   {
    low = mid + 1;
    result = mid;
    qq = min;
    continue;
   }
   hash[now] = 1;
   for (j = 1; j <= n; ++j)
   {
    if (!hash[j] && map[j][now].dist != -1 && (map[j][now].dist + min < dis[j] || dis[j] == -1) &&
     (map[j][now].height >= mid || map[j][now].height == -1))
    {
     dis[j] = map[j][now].dist + min;
    }
   }
  }
 }
}
int main()
{
 int n, m;
 int cnt = 0;
 while (scanf("%d %d", &n, &m) != EOF)
 {
  
  if (n == 0 && m == 0)
  {
   break;
  }
  cnt++;
  if (cnt != 1)
  {
   printf("\n");
  }
  printf("Case %d:\n", cnt);
  int i, j;
  for (i = 1; i <= n; ++i)
  {
   for (j = 1; j <= n; ++j)
   {
    map[i][j].height = -2;
    map[i][j].dist = -1;
   }
  }
  for (i = 0; i < m; ++i)
  {
   int start, end, height, dist;
   scanf("%d %d %d %d", &start, &end, &height, &dist);
   map[start][end].height = map[end][start].height = height;
   map[start][end].dist = map[end][start].dist = dist;
  }
  int s,e,max_height;
  scanf("%d %d %d", &s, &e, &max_height);
  result = 0;
  dijkstra(s,e,n,max_height);
  if (!result)
  {
   printf("cannot reach destination\n");
  }
  else
  {
   printf("maximum height = %d\n", result);
   printf("length of shortest route = %d\n", qq);
  }
 }
 return 0;
}

posted on 2009-07-26 16:01  ZAFU_VA  阅读(252)  评论(0)    收藏  举报

导航