題意:求一棵樹的嚴格次小生成樹,即權值嚴格大於最小生成樹且權值最小的生成樹。
思路:若現在已經得到了最小生成樹,那麼若 新增一條邊e,就會得到乙個環,我們只需要去掉環上權值小於e且最大的一條邊就會得到另一棵較優的生成樹。因此,只需要列舉不在生成樹上的邊,計算將其添 加到最小生成樹中得到的新生成樹的權值。取最小值即可。那麼,現在的問題就是在乙個圈中找到乙個最大的小於新新增的邊的權值的邊。由於最小生成樹是一棵 樹,可以利用最近公共祖先,並記錄路徑上權值的最大和次大值。則新加入的邊若大於圈上其他邊的最大值x,刪掉x即可;否則掉圈上的次小值。
struct node
;node a[n<<2];
vector> g[n];
int f[n][20],dp1[n][20],dp2[n][20];
int n,m;
int cmp(node a,node b)
int deal(int x,int a,int b)
if(a==-1) return -1;
return x-a;
}i64 cal(int t)
}up(dp1[u][0],max1,max2);
up(dp2[u][0],max1,max2);
up(dp1[v][0],max1,max2);
up(dp2[v][0],max1,max2);
return deal(w,max1,max2);
}int main()
sort(a+1,a+m+1,cmp);
for1(i,n) p[i]=i;
i64 ans=0;
int u,v;
for1(i,m)
dfs(1,-1);
init();
i64 k=inf,temp;
for1(i,m) if(a[i].flag)
pr(ans+k);
}
BZOJ 1977 次小生成樹
傳送門 求嚴格次小生成樹 權值和嚴格小於最小生成樹 和無限制的次小生成樹一樣,唯一不同的是,嚴格小於,只需要將刪除非樹邊連線的兩點樹鏈上的最長邊改為刪除1.如果最長邊不等於該邊,就直接計算2.如果等於,就用次長邊計算。在最小生成樹上倍增即可。includeusing namespace std na...
BZOJ 1977 次小生成樹(最近公共祖先)
題意 求一棵樹的嚴格次小生成樹,即權值嚴格大於最小生成樹且權值最小的生成樹。先求最小生成樹,對於每個不在樹中的邊,取兩點間路徑的資訊,如果這條邊的權值等於路徑中的權值最大值,那就刪掉路徑中的次大值,加上這條非樹邊,更新答案 否則刪掉路徑中的最大值,加上這條非樹邊,更新答案。1 include2 in...
BZOJ 1977 嚴格次小生成樹
題目鏈結 題意 求乙個圖的嚴格次小生成樹,n 100000,m 300000,邊權非負且 1e9 思路 按照正常次小生成樹思路,先生成一顆最小生成樹,並記錄任意兩點路徑上的最長邊,然後列舉非最小樹邊來求得答案,但現在要求的是嚴格次小生成樹所以我們還得知道兩點路徑上的嚴格次長邊 我們考慮使用lca維護...