1. 程式人生 > >2017 UESTC Training for Graph Theory

2017 UESTC Training for Graph Theory

拓撲排序 都是 一個 for ... ini 我們 初始化 lock

圖論姿勢太弱,這套題做了好久。。

A:枚舉最短那條邊,然後最小生成樹那種操作,1 和 n 聯通就算答案

B:考慮到假如我們能湊出x的話,那很明顯我們也能湊出任意數表示x + ai,考慮選取一個ai,然後dis[x]表示能湊出k % ai == x的最小k,跑一次最短路,初始化dis[0] = 0,假設選擇的ai為A,然後0 - A-1對於每個數ai都連一條邊則dis[(u + aj) % A] = min(dis[(u + aj) % A],dis[u] + aj);判斷的時候if(X >= dis[X%A])

C:我的zz做法是這樣的,行列拆開,源點往每一行連一條(Rowcnt[i]/2,(Rowcnt[i] + 1)/2)上下界的邊,每一列對匯點也這樣連,對於每個點,行列連一條(0,1)上下界的邊,然後跑一次上下界可行流。。。不過TLE了好幾發,優化一下過了,估計不是正經做法。

D:拓撲排序。先建圖,對於第i個名字和i+1個名字,找出第一個不同的字母,然後就可以連一條邊,不過如果第i+1個名字是第i個名字的前綴的話,那很明顯是無解的

E:差分約束,跑一次最大,一次最小就好了

F:考慮從安全點倒著跑,因為安全點是確定的,能到達安全點的肯定對可達安全點/安全點的點連了d+1條邊,所以倒著來做一次dij,對於前d次的更新直接忽略,因為這d次都是會被封鎖的,所以更新到d+1次的時候這個點就已經確定了,把這個點相連的邊加進堆裏,繼續更新,直到沒有確定的點。

G:先縮點,那就有一個dag圖了,對於逆行一條邊(u,v),顯然逆行之後必須要(1 - > v,u > 1)才會加答案,把這條邊去掉不看的話,就是出現了兩條鏈,所以對於dag圖,正向反向跑一次dp,dp[i]表示1到i最長經過幾個點,rdp[i]表示i到1最長經過幾個點,然後枚舉每條邊答案就更新為max(dp[v] + rdp[u] - size[1])

H:A1...An,n個變量,每個Ci,j都是一個有關變量的方程,n個變量n個方程,跑一次最小生成樹。

I:暴力dfs即可

J:考慮把條件轉化成Sum[i] - Sum[i - p] >= s ,Sum[i] - Sum[i - q] <= t,然後跑一次差分約束

K:離散下直接最短路

2017 UESTC Training for Graph Theory