感受
思路
BFS+优先队列
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e3 + 10;
const int maxm = 2e4 + 10;
struct edge{
int v, nex, w;
}e[maxm];
int n, p, k, head[maxn], cnt;
void init(){
cnt = 0;
for(int i = 0; i <= n; i++){
head[i] = -1;
}
}
void add_edge(int u, int v, int w){
e[cnt] = (edge){v, head[u], w};
head[u] = cnt++;
}
bool vis[maxn];
void dfs(int u){
if(vis[u]) return ;
vis[u] = true;
int v;
for(int i = head[u]; ~i; i = e[i].nex){
v = e[i].v;
dfs(v);
}
}
int num[maxn];
struct node{
int u; int used;
bool operator < (const node& b)const{
return used > b.used;
}
};
void bfs(int u, int val){
priority_queue<node> que;
que.push((node){u, 0}); num[u] = 0;
while(!que.empty()){
node tmp = que.top(); que.pop();
int u, v, w; u = tmp.u;
if(vis[u]) continue;
for(int i = head[u]; ~i; i = e[i].nex){
v = e[i].v; w = e[i].w; if(vis[v]) continue;
if(w > val){
if(num[v] == -1 || num[v] > num[u] + 1){
num[v] = num[u] + 1;
que.push((node){v, num[v]});
}
}
else{
if(num[v] == -1 || num[v] > num[u]){
num[v] = num[u];
que.push((node){v, num[v]});
}
}
}
vis[u] = true;
}
}
bool check(int b){
bfs(n, b);
return num[1] <= k;
}
void Init(){
for(int i = 1; i <= n; i++){
vis[i] = false; num[i] = -1;
}
}
int main(){
scanf("%d%d%d", &n, &p, &k);
init();
int u, v, w;
while(p--){
scanf("%d%d%d", &u, &v, &w);
add_edge(u, v, w); add_edge(v, u, w);
}
dfs(1);
if(!vis[n]){
puts("-1"); return 0;
}
int l = -1, r = 1e6, mid;
while(r - l > 1){
mid = (l + r) / 2;
Init();
if(check(mid)){
r = mid;
}
else{
l = mid;
}
}
printf("%d\n", r);
return 0;
}
BFS+deque
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e3 + 10;
const int maxm = 2e4 + 10;
struct edge{
int v, nex, w;
}e[maxm];
int n, p, k, head[maxn], cnt;
void init(){
cnt = 0;
for(int i = 0; i <= n; i++){
head[i] = -1;
}
}
void add_edge(int u, int v, int w){
e[cnt] = (edge){v, head[u], w};
head[u] = cnt++;
}
bool vis[maxn];
void dfs(int u){
if(vis[u]) return ;
vis[u] = true;
int v;
for(int i = head[u]; ~i; i = e[i].nex){
v = e[i].v;
dfs(v);
}
}
int num[maxn];
void bfs(int u, int val){
deque<int> que;
que.push_front(u); num[u] = 0;
while(!que.empty()){
int u = que.front(); que.pop_front();
int v, w;
if(vis[u]) continue;
for(int i = head[u]; ~i; i = e[i].nex){
v = e[i].v; w = e[i].w; if(vis[v]) continue;
if(w > val){
if(num[v] == -1 || num[v] > num[u] + 1){
num[v] = num[u] + 1;
que.push_back(v);
}
}
else{
if(num[v] == -1 || num[v] > num[u]){
num[v] = num[u];
que.push_front(v);
}
}
}
vis[u] = true;
}
}
bool check(int b){
bfs(n, b);
return num[1] <= k;
}
void Init(){
for(int i = 1; i <= n; i++){
vis[i] = false; num[i] = -1;
}
}
int main(){
scanf("%d%d%d", &n, &p, &k);
init();
int u, v, w;
while(p--){
scanf("%d%d%d", &u, &v, &w);
add_edge(u, v, w); add_edge(v, u, w);
}
dfs(1);
if(!vis[n]){
puts("-1"); return 0;
}
int l = -1, r = 1e6, mid;
while(r - l > 1){
mid = (l + r) / 2;
Init();
if(check(mid)){
r = mid;
}
else{
l = mid;
}
}
printf("%d\n", r);
return 0;
}



京公网安备 11010502036488号