LA 5717列舉 最小生成樹迴路性質

2022-09-15 22:36:15 字數 1895 閱讀 6601

1

/*la 5717

2《訓練指南》p343

3最小生成樹的迴路性質

4在生成的最小生成樹上,新增一條邊e(u,v)

5若原圖上u到v的路徑的最大邊大於e,則刪除此邊,加上e,否則不變。67

若原圖上u到v的路徑的最大邊的產生:bfs/dfs都可 ,nm的複雜度,從每個點出發,找到每條邊,更新最大即可8*/

910 #include11 #include

12 #include13 #include14 #include15 #include16 #include17 #include18 #include

19 #include20

#define ll unsigned long long

21#define maxn 1010

22#define inf 99999

23using

namespace

std;

2425

double

x[maxn];

26double

y[maxn];

27int

peo[maxn];

28int

p[maxn];

29double l;//

最小生成樹總長度

30double

maxdis[maxn][maxn];

31int

n,cnt;

3233

double

nextnum()

3439

intnextint()

4045

46struct

edge

4753

void

print()

5457 } e[maxn*maxn];

5859 vectoredges;//

儲存新圖的邊

60 vectorg[maxn];//

記錄臨街的邊號

6162

double dis(int i,int

j)63

6768

int findx(int

x)69

7374

void merge(int x,int

y)75

8081

void

init()

8291

for(int i=1; i<=n; i++)

92for(int j=1; j<=n; j++)

93;//

建圖96}97

}9899void prim()//

最小生成樹&&構建新的圖

100);

115 g[u].push_back(edges.size()-1

);116

edges.push_back((edge));

117 g[v].push_back(edges.size()-1

);118

119if (edges.size()==2*(n-1)) break

;120

}121

}122 typedef pair node;//

《上乙個點,由起點到上乙個點的通路上的最大值》

123void max_dis()//

找到最小生成樹上的任意兩點之間的通路的最大的邊的長度,網上大多數版本是dfs實現,故寫了bfs

124147

}148

}149

}150

151int

main()

152168 printf("

%.2lf\n

",ans);

169}

170return0;

171 }

hdu 1598 列舉 最小生成樹

本題要求一條通路中,最高速與最低速的差值最小。這樣的題與求最小生成樹的題的求法完全不一樣了。為了保證通路中差值最小,應先對權值從小到大排序,然後遍歷所有的點進行查詢。起點的位置逐漸變大 保證每個點都遍歷 而只要所求的兩點連通,立刻break,以保證差值最小。include stdio.h inclu...

LA3887(最小生成樹)

給你乙個n n 100 個節點和m條邊的圖,你需要求乙個最大權值邊減去最小權值邊最小的生成樹。需要用到最小生成樹的思維 kruskal所求的最小生成樹保證了乙個條件,就是最大邊權最小。利用這個條件,我們從小到大列舉最小邊,然後用kruskal求最小生成樹,在這個最小生成樹上取最大邊,答案取最小值就好...

jzoj5895 旅遊 最小生成樹 尤拉迴路

本來暈乎乎的看到可憐就瞬間清醒了 其實我們可以通過加邊使得條件由每條邊走至少一次變成每條邊走恰好一次。注意到給出的邊非常特殊,可以發現所有有貢獻的邊都在最小生成樹上。如果n很小也可以考慮傳遞閉包做 考慮怎麼加邊,我們發現每次加邊會使兩端點度數的奇偶性發生變化。由於我們新增的實際上是一條路徑,那麼我們...