題面一道最短路好題……
開始和喻隊長討論了一下,喻隊長一眼切:列舉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需要通過這一片魔法森林,才能夠拜訪到隱士。魔法森林中居住了一些妖怪。每當有人經過一條邊的時候,這條...