洛谷 1462多种写法

第一种

#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.判断到达终点时血量是否足够不同,第一种没有提前退出,第二种提前退出了,第二种更快一些

第一种:

 

第二种:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值