bzoj1086: [SCOI2005]王室联邦ITeye - 众发娱乐

bzoj1086: [SCOI2005]王室联邦ITeye

2019年02月27日12时16分56秒 | 作者: 幻丝 | 标签: 联通,分块,一棵树 | 浏览: 1407

求强联通分块,让其变成一棵树,关于书上每一个点(强连通重量,其内部点数为权值),关于他每一个孩子,若 k就分红一个省,省会为该点,最终再加上该点的权值,若 k,分省,不然递归上去给父亲,最终出来要特别处理

const int N = 1010;
typedef vector int 
struct Edge {
 int v;
 Edge *Next;
 Edge() {}
 Edge(int _v, Edge *_Next) : v(_v), Next(_Next) {}
} *Fir[N];
int n, m;
int Belong[N], Head[N], Vis[N], Tot;
inline void Input() {
 scanf("%d%d", n, 
 Rep(i, n - 1) {
 int x, y;
 scanf("%d%d", x, 
 Fir[x] = new Edge(y, Fir[x]), Fir[y] = new Edge(x, Fir[y]);
inline void Check(VI Q, int u) {
 if(sz(Q) = m) {
 Head[++Tot] = u;
 Rep(i, sz(Q)) Belong[Q[i]] = Tot;//, printf("%d ", Q[i]);
 //printf("\n");
 Q.clear();
inline VI Search(int u) {
 VI Q, T;
 Q.clear(), Vis[u] = 1;
 int v;
 for(Edge *Tab = Fir[u]; Tab != NULL; Tab = Tab- Next)
 if(!Vis[v = Tab- v]) {
 T = Search(v);
 /*if(u  6) {
 Rep(i, sz(T)) printf("%d ", T[i]);
 printf("\n");
 Q.insert(Q.end(), T.begin(), T.end()), Check(Q, u);
 Q.pub(u), Check(Q, u);
 return Q;
inline void Solve() {
 VI Q = Search(1);
 if(Tot) {
 Rep(i, sz(Q)) Belong[Q[i]] = Tot;
 printf("%d\n", Tot);
 For(i, 1, n) printf(i n ? "%d " : "%d\n", Belong[i]);
 For(i, 1, Tot) printf(i Tot ? "%d " : "%d\n", Head[i]);
 } else puts("-1");
int main() {
 #ifndef ONLINE_JUDGE
 SETIO("1086");
 #endif
 Input();
 Solve();
 return 0;
}

 

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表众发娱乐立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章

阅读排行

  • 1

    bzoj1086: [SCOI2005]王室联邦ITeye

    联通,分块,一棵树
  • 2

    bzoj1086: [SCOI2005]王室联邦ITeye

    联通,分块,一棵树
  • 3

    MFC动态链接库ITeye

    文件,运用,头文件
  • 4

    WebService JaxITeye

    功用,客户端,运用
  • 5
  • 6
  • 7

    Java 动态署理ITeye

    动态,办法,调用
  • 8

    ClassLoader学习笔记ITeye

    运用,模块,供给
  • 9

    java compareTo ComparatorITeye

    字符串,长度,办法
  • 10