NOIP2013 D1T3 貨車運輸 zz恥辱記

2022-03-26 01:27:34 字數 1593 閱讀 3085

目錄先來證明下lemma: 圖上2點間最小邊權最大的路徑一定在mst上

感性理解下:

每次kruskal algo都連線最大的不成環邊

此時有2個未聯通的聯通塊被連起來.

那麼考慮u, v兩點的聯通塊 : 它們並起來時選的邊最大. (將比這條邊大的邊加入生成樹不能使得u,v聯通)

這個思想是kruskal重構樹的基礎(每個聯通塊選取乙個代表點)

sb題, 但是做的噎屎了, 花了1.5h

我還是應該熟悉一下 最小生成樹, 樹上倍增和並查集

2個sb錯誤:

見code l58

並查集沒初始化

//file headers start

#includeusing namespace std;

#define rep(i, _st, _ed) for(register int i = (_st); i <= (_ed); ++i)

int read()

while(isdigit(c))

return ans * f;

}void put(int num)

void testread() }

const int maxn = 10005, maxm = 50005;

struct graphedge[maxm*2];

int head[maxn], n, m;

void adde(int u, int v, int w)

//file headers end

struct ee

}e[maxm];

int fa[maxn];

int find(int u)

int dep[maxn], f[21][maxn], vis[maxn], d[21][maxn];

void dfs(int u, int fa)

}int lcapth(int u, int v)

}return min(ans, min(d[0][u], d[0][v]));

}signed main()

sort(e+1, e+m+1);

rep(i, 1, n) fa[i] = i; //don't forget initialize bcj!!!

rep(i, 1, m)

}rep(i, 1, n) if(vis[i] == 0) dfs(i, 0), f[0][i] = i, d[0][i] = 1e9; //root should form self loop

rep(i, 1, 20)rep(j, 1, n) f[i][j] = f[i-1][f[i-1][j]], d[i][j] = min(d[i-1][j], d[i-1][f[i-1][j] ]);

int q = read();

while(q--)

return 0;}/*

5 74 3 4440

3 1 22348

1 3 28368

2 4 25086

5 3 6991

4 3 10638

3 1 11106

44 5

1 35 4

2 5*/

NOIP2013 D1T3 貨車運輸

noip2013t3 貨車運輸 背景noip2013day1 描述a 國有 n 座城市,編號從 1 到 n,城市之間有 m 條雙向道路。每一條道路對車輛都有重 量限制,簡稱限重。現在有 q 輛貨車在運輸貨物,司機們想知道每輛車在不超過車輛限重的 情況下,最多能運多重的貨物。輸入格式 輸入檔案第一行有...

NOIP2013 D1 T2火柴排隊

涵涵有兩盒火柴,每盒裝有 n 根火柴,每根火柴都有乙個高度。現在將每盒中的火柴各自排成一列,同一列火柴的高度互不相同,兩列火柴之間的距離定義為 ai bi 2 其中 ai 表示第一列火柴中第 i 個火柴的高度,bi 表示第二列火柴中第 i 個火柴的高度。每列火柴中相鄰兩根火柴的位置都可以交換,請你通...

noip2013 d1t2 火柴排隊

看不出是逆序對.感覺藥丸 首先要看出最優解就是兩個陣列均有序的時候 再對兩個陣列的下標求逆序對即可 歸併 樹狀陣列 1 include2 include3 include4 include5 include6 define modd 99999997 7using namespace std 8co...