一道最短路好题……
开始和讨论了一下,喻队长一眼切:枚举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; 8 const int N=50005,M=100005,INF=50005; 9 int gi(){10 int str=0;char ch=getchar();11 while(ch>'9' || ch<'0')ch=getchar();12 while(ch>='0' && ch<='9')str=(str<<1)+(str<<3)+ch-48,ch=getchar();13 return str;14 }15 int n,m;16 struct node{17 int x,y,dis,dist;18 bool operator <(const node &pp)const{19 return dis f[x]?a[i].dis:f[x];41 if(tmp
喻队长的小常数代码,比某蒟蒻快一倍