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;
}
浙公网安备 33010602011771号