目錄先來證明下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...