模擬賽 最小環 題解

2022-06-20 14:15:13 字數 1087 閱讀 8090

求包含1號點的最小環。

這個最小環一定是從1點的出邊指向的點出發,再回到另乙個1點的出邊指向的點。

這等價於1號點所有出邊指向的點中,兩兩之間最短路+1號點到這兩個點的距離的最小值。

使用二進位制拆分,分成兩組點,分別向s,t連邊,正反算兩次最短路。

時間複雜度 \(o((n+m)log^2 n)\)

二進位制分組是很常用的思路。

#include #include using namespace std;

int fr[5010],ne[30010],inf=999999999;

int v[30010],w[30010],bs=0,n;

int jl[5010],sz[5010],cd1[5010],cd2[5010];

bool bk[5010];

void addb(int a,int b,int c)

struct sjd

; sjd(int z,int u)

bool operator<(const sjd&a)const };

int dij(int s,int t)

jl[s]=0;

priority_queuedl;

dl.push(sjd(0,s));

while(!(dl.empty()))

else

}int rt=dij(n,n-1);

if(rtjg=rt;

bs-=k*2;

for(int j=0;jfr[sz[j]]=ne[fr[sz[j]]];

fr[n]=fr[n-1]=-1;

//for(int j=0;jelse

}rt=dij(n,n-1);

if(rtjg=rt;

bs-=k*2;

for(int j=0;jfr[sz[j]]=ne[fr[sz[j]]];

fr[n]=fr[n-1]=-1;

} printf("%d",jg);

fclose(stdin);

fclose(stdout);

return 0;

}

模板 最小環

題意 在乙個無向圖里找出乙個由至少三個點組成環,使得環上邊的權值和最小。首先,由於我們的環至少要有三個點,我們就考慮每次列舉環的兩個端點 不關心端點中間有多少個點 再用另外乙個點將這兩個端點連線起來,那麼就一定能夠保證形成乙個至少有三個點的環。想一想,這樣是不是有什麼問題?如果用於連線的點本來就在環...

最小環問題

floyd找最小環 模板 mp i j mp i j mp i j 記錄i ii到j jj的最短路,dis i j dis i j dis i j 代表原始圖的頂點間的關係 非i ii到j jj的最短路 ll ans inf ans為最小環的長度 for int k 1 k n k for int ...

模擬賽 circle 題解

題意 有n個數,問有多少個x,x leq t 滿足這n個數分別 x後,異或和為s。每個數小於 2 m 數字dp。由於是加法,需要記錄進製,因此從低位到高位dp。只要記錄下有幾個進製,就可以根據這n的數的大小知道究竟是哪幾個進製了。設 dp i,j,0 1 表示考慮到第i位,有j個進製,與t的大小關係...