有 个城镇被分成了 个郡,有 条连接城镇的无向边。要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都。
Constraints
, ,
Solution
每个点 拆成两对点, 代表选择 为首都, 表示不选择 为首都, 表示 的前缀已包含首都, 表示 的前缀不包含首都。
对于每一条原图中无向边 ,因为至少有一个端点为首都,连边 ,。
对于每一个点 ,连边 ,。
对于每一个点 与它的上一个点 ,连边方式如下:,,,。
Code
1 |
|
Living is do or die.
有 n 个城镇被分成了 k 个郡,有 m 条连接城镇的无向边。要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都。
1≤n≤106 ,0≤m≤106 ,1≤k≤n
每个点 x 拆成两对点,x 代表选择 x 为首都,x+n 表示不选择 x 为首都,x+2n 表示 x 的前缀已包含首都,x+3n 表示 x 的前缀不包含首都。
对于每一条原图中无向边 (x,y) ,因为至少有一个端点为首都,连边 (x+n,y) ,(y+n,x)。
对于每一个点 x ,连边 (x,x+2n) ,(x+3n,x+n)。
对于每一个点 x 与它的上一个点 last ,连边方式如下:(last+2n,x+2n),(x+3n,last+3n),(last+2n,x+n),(x,last+3n)。
1 | #include<cstdio> |