求包含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的大小關係...