第一种
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int N = 1e4 + 5;
const int M = 1e5 + 10;
int n, m, b;
int cnt = 0, head[N], f[N], v[N], dist[N], a[N];
struct node
{
int num;
int d;
bool operator < (const node& s) const
{
return d > s.d;
}
};
struct ed
{
int to;
int next;
int w;
} edge[M];
void add(int u, int v, int w)
{
cnt++;
edge[cnt].to = v;
edge[cnt].w = w;
edge[cnt].next = head[u];
head[u] = cnt;
}
bool check(int tf)
{
if (f[1] > tf || f[n] > tf) return false;
for (int i = 1; i <= n; i++)
{
dist[i] = 1e9;
v[i] = 0;
}
dist[1] = 0;
priority_queue<node> qu;
qu.push({ 1, 0 });
while (!qu.empty())
{
node e = qu.top(); qu.pop();
if (e.num == n) return b >= dist[n];
if (v[e.num]) continue;
v[e.num] = 1;
for (int i = head[e.num]; i > 0; i = edge[i].next)
if (f[edge[i].to] <= tf)
{
if (dist[edge[i].to] > dist[e.num] + edge[i].w)
{
dist[edge[i].to] = dist[e.num] + edge[i].w;
qu.push({ edge[i].to, dist[edge[i].to] });
}
}
}
return false;
}
int main()
{
scanf("%d %d %d", &n, &m, &b);
for (int i = 1; i <= n; i++)
{
scanf("%d", &f[i]);
a[i] = f[i];
}
for (int i = 1; i <= m; i++)
{
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
add(u, v, w); add(v, u, w);
}
sort(a + 1, a + n + 1);
int l = 1, r = n, ans = -1;
while (l <= r)
{
int mid = (l + r) >> 1;
if (check(a[mid]))
{
ans = a[mid];
r = mid - 1;
}
else
l = mid + 1;
}
if (ans == -1)
printf("AFK");
else
printf("%d", ans);
return 0;
}
第二种
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
const int N = 1e4 + 5;
const int M = 1e5 + 10;
int n, m, b;
int cnt = 0, head[N], f[N], v[N], dist[N], a[N];
struct node
{
int num;
int d;
bool operator < (const node& s) const
{
return d > s.d;
}
};
struct ed
{
int to;
int next;
int w;
} edge[M];
void add(int u, int v, int w)
{
cnt++;
edge[cnt].to = v;
edge[cnt].w = w;
edge[cnt].next = head[u];
head[u] = cnt;
}
bool check(int tf)
{
if (f[1] > tf || f[n] > tf) return false;
for (int i = 1; i <= n; i++)
{
dist[i] = 1e9;
v[i] = 0;
}
dist[1] = 0;
priority_queue<node> qu;
qu.push({ 1, 0 });
while (!qu.empty())
{
node e = qu.top(); qu.pop();
if (e.num == n) return b >= dist[n];
if (v[e.num]) continue;
v[e.num] = 1;
for (int i = head[e.num]; i > 0; i = edge[i].next)
if (f[edge[i].to] <= tf)
{
if (dist[edge[i].to] > dist[e.num] + edge[i].w)
{
dist[edge[i].to] = dist[e.num] + edge[i].w;
qu.push({ edge[i].to, dist[edge[i].to] });
}
}
}
return false;
}
int main()
{
scanf("%d %d %d", &n, &m, &b);
for (int i = 1; i <= n; i++)
{
scanf("%d", &f[i]);
a[i] = f[i];
}
for (int i = 1; i <= m; i++)
{
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
add(u, v, w); add(v, u, w);
}
sort(a + 1, a + n + 1);
int l = 1, r = n;
while (l < r)
{
int mid = (l + r) >> 1;
if (check(a[mid]))
{
r = mid;
}
else
l = mid + 1;
}
if (!check(a[l]))
printf("AFK");
else
printf("%d", a[l]);
return 0;
}
不同点有两个:
1.二分的写法不同
2.判断到达终点时血量是否足够不同,第一种没有提前退出,第二种提前退出了,第二种更快一些
第一种:
第二种: