bzoj3669 NOI2014 魔法森林

2022-08-15 21:00:19 字數 1514 閱讀 5217

題面

一道最短路好題……

開始和喻隊長討論了一下,喻隊長一眼切:列舉ai

的上界max,

每次把ai

小於等於max

的邊加到圖里,以bi

為邊權跑最短路。

但是,這樣做是o

(ai*m

)的,妥妥tle

,於是我們想了一些鬼畜剪枝優化常數,然並卵……喻隊長身先士卒(比喻隊長帶頭,走在蒟蒻前面),交了一波,tle60

分。

後來,看了題解才發現這道題是spfa

的玄學用途——維護動態加邊的圖的最短路!只此一家,絕無僅有!走過路過千萬不要錯過!於是我們就可以不用打lct

來維護一棵最小生成樹(正解)。

具體做法其實很簡單,每次距離陣列不清零,只把新加入的邊的兩端點入隊。這樣的複雜度就是o

(m)的了(也許吧,畢竟spfa

太玄學了),因為最後加起來相當於對原圖跑一遍spfa

。%%%%%%%%%%%%%%%喻隊長

1     #include 2     #include 3     #include 4     #include 5     #include 6     #include 7

using

namespace

std;

8const

int n=50005,m=100005,inf=50005;9

intgi()

15int

n,m;

16struct

node

21}e[m];

22int head[n],num=0;23

struct

lina[m<<1

];26

void init(int x,int y,int

z)31

void addedge(int x,int y,int

z)34

int t=0,sum=0,q[n*10],mod=n*10,f[n],ans=(inf<<1);bool

vis[n],usd[m];

35bool spfa(int

lim)47}

48}49 vis[x]=false;50

}51if(f[n]==inf)return

false

;52 ans=min(ans,f[n]+lim);

53return

true;54

}55void build(int

sta)63}

64void

work()

77if(ans==(inf<<1))printf("

-1\n");

78else printf("

%d\n

",ans);79}

80int

main()

81

喻隊長的小常數**,比某蒟蒻快一倍

bzoj3669 NOI2014 魔法森林

給定n個點m條邊的無向圖,每條邊有兩個權值a與b。求一條1到n的路徑使得路徑經過邊的最大a與最大b的和最小。無法到達輸出 1。n 50000,m 100000。我們嘗試列舉路徑的最大a值,那麼我們只需按照a排序按順序插入,維護1到n的b最大值即可。用並查集維護連通性。當加入j到k這條邊時如果形成環,...

bzoj 3669 Noi2014 魔法森林

description 為了得到書法大家的真傳,小e同學下定決心去拜訪住在魔法森林中的隱士。魔法森林可以被看成乙個包含個n節點m條邊的無向圖,節點標號為1.n,邊標號為1.m。初始時小e同學在1號節點,隱士則住在號節點n。小e需要通過這一片魔法森林,才能夠拜訪到隱士。魔法森林中居住了一些妖怪。每當有...

bzoj 3669 NOI2014 魔法森林

為了得到書法大家的真傳,小e同學下定決心去拜訪住在魔法森林中的隱士。魔法森林可以被看成乙個包含個n節點m條邊的無向圖,節點標號為1.n,邊標號為1.m。初始時小e同學在號節點1,隱士則住在號節點n。小e需要通過這一片魔法森林,才能夠拜訪到隱士。魔法森林中居住了一些妖怪。每當有人經過一條邊的時候,這條...