这破题调了我一天...错了一大堆细节T T
首先显然可以将边权先排序,然后逐个加进图中。
加进图后,倍增跑跑看能不能到达n,不能的话加新的边继续跑。
倍增的时候要预处理出h[i]表示转移矩阵的2^0~i的或和,转移是h[i]=h[i-1]*h[i-1]。
注意两个矩阵包含0~i和0~j相乘的时候,得到的矩阵是0~i*j的,而两个矩阵包含0~i和0~j或起来的时候,得到的矩阵是j~i+j的。
倍增的时候因为必须答案单调,所以当前的值必须或上之前的值。
#include#include #include #include #include #include #include using namespace std;const int maxn=160, inf=1e9+160;struct mtx{bitset mp[maxn]; mtx(){ for(int i=0;i >=1, tmp=tmp*tmp) if(b&1) f=f*tmp;}inline bool cmp(poi a, poi b){ return a.dis =0;j--) if(a[i].dis+ans+(1< <=a[i+1].dis) { tmp2=tmp1; tmp2=tmp2*h[j]; if(tmp2.mp[1][n]) continue; ans+=(1<