题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1015

题解:

  如果按照题目的意思,每次删点、删边太困难了……于是采用逆向思维,构造出最后的情况,往上加点、加边,用并查集判断连通块即可

  [ATTENTION]易犯错误:逆向的最开始连通块个数cnt为n-k个而不是n个,每次加点时cnt++,然后在并集的时候再相应地减

 #include<cstdio>
#define MAXN 400010
int n,m,k,head[MAXN],fa[MAXN],cnt,ans1,ans2[MAXN];
bool att[MAXN];
struct edge
{
int v,next;
}e[MAXN];
void add(int i,int x,int y)
{
e[i]=(edge){y,head[x]};
head[x]=i;
}
int getfa(int x)
{
return fa[x]=fa[x]==x?x:getfa(fa[x]);
}
void work(int dep)
{
if(dep==k+)
{
for(int u=;u<=n;u++)
{
if(att[u])continue;
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].v;
if(att[v])continue;
int p=getfa(u),q=getfa(v);
if(p!=q)
{
fa[q]=p;
cnt--;
}
}
}
return;
}
int x;
scanf("%d",&x);
att[++x]=true;
work(dep+);
ans2[++ans1]=cnt;
cnt++;
att[x]=false;
for(int i=head[x];i;i=e[i].next)
{
int v=e[i].v;
if(att[v])continue;
int p=getfa(x),q=getfa(v);
if(p!=q)
{
fa[q]=p;
cnt--;
}
}
}
int main()
{
scanf("%d%d",&n,&m);
int x,y;
for(int i=;i<=m;i++)
{
scanf("%d%d",&x,&y);
add(i<<,++x,++y);
add((i<<)+,y,x);
}
scanf("%d",&k);
cnt=n-k;
for(int i=;i<=n;i++)fa[i]=i;
work();
printf("%d\n",cnt);
for(int i=ans1;i>=;i--)printf("%d\n",ans2[i]);
return ;
}

PS:感觉自己宛如一个滞胀……竟然在并查集那里卡了好久……

bzoj 1015 星球大战starwar的更多相关文章

  1. BZOJ 1015 星球大战starwar 逆向并查集

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1015 题目大意: 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个 ...

  2. BZOJ 1016 星球大战starwar(逆向-并查集)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1015 题意:给出一个图.每次删掉一个点,求删掉之后连通块个数. 思路:正着做不好做,我们 ...

  3. BZOJ 1015 星球大战

    Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过 ...

  4. BZOJ [JSOI2008]星球大战starwar

    正着显然不可做,我们采取反向并查集,将删点改为加点,每次贪心的认为加了一个联通块,一旦不符就减一. #include<bits/stdc++.h> using namespace std; ...

  5. BZOJ 1015 星球大战(并查集)

    正着不好搞,考虑倒着搞.倒着搞就是一个并查集. # include <cstdio> # include <cstring> # include <cstdlib> ...

  6. 【BZOJ】【1015】 【JSOI2008】星球大战starwar

    并查集/时光倒流 删点维护连通块个数比较难处理,所以我们就逆序来做,先处理最后状态下有多少连通块,再依次加入被删的点,这样就变删点为加点,利用并查集即可维护连通块个数. /************** ...

  7. BZOJ 1015: [JSOI2008]星球大战starwar 并查集

    1015: [JSOI2008]星球大战starwar Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝 ...

  8. 【BZOJ】1015: [JSOI2008]星球大战starwar

    1015: [JSOI2008]星球大战starwar 题意:一个点数为N(1<= 40w),边数为M(1<=20w)的图,总共删除k个节点,问开始以及每次删除一个节点之后图的连通块数? ...

  9. BZOJ 1015 [JSOI2008]星球大战starwar

    1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 3551  Solved: 1581[Submit ...

随机推荐

  1. 【bzoj3732】Network 最小生成树+倍增LCA

    题目描述 给你N个点的无向图 (1 <= N <= 15,000),记为:1…N. 图中有M条边 (1 <= M <= 30,000) ,第j条边的长度为: d_j ( 1 & ...

  2. BZOJ4710 JSOI2011分特产(容斥原理+组合数学)

    显然可以容斥去掉每人都不为空的限制.每种物品分配方式独立,各自算一个可重组合乘起来即可. #include<iostream> #include<cstdio> #includ ...

  3. [洛谷P3224][HNOI2012]永无乡

    题目大意:给你$n$个点,每个点有权值$k$,现有两种操作: 1. $B\;x\;y:$将$x,y$所在联通块合并2. $Q\;x\;k:$查询第$x$个点所在联通块权值第$k$小是哪个数 题解:线段 ...

  4. Linux(ubuntu 12.04桌面版) 搭建Android开发环境

    因为一些工作上的原因,需要切换到Linux环境下做点开发,我选择的Linux发行版本为ubuntu(我不建议使用fedora,我最开始就是使用的fedora,但发现并不是特别好使,有些插件没办法安装, ...

  5. Android Canvas 绘图

    画布(Canvas)是图形编程中一个很普通的概念,通常由三个基本的绘图组件组成:       Canvas  提供了绘图方法,可以向底层的位图绘制基本图形.       Paint  也称为" ...

  6. 洛谷4643:【模板】动态dp——题解

    https://www.luogu.org/problemnew/show/P4643 很妙……让我重新又看了一遍猫锟的WC课件. 推荐一个有markdown神犇题解:https://www.cnbl ...

  7. AOJ.592 神奇的叶子

    神奇的叶子 Time Limit: 1000 ms Case Time Limit: 1000 ms Memory Limit: 64 MB Total Submission: 920 Submiss ...

  8. 【图论-最短路】【P3393】逃离僵尸岛

    传送门 Description 小a住的国家被僵尸侵略了!小a打算逃离到该国唯一的国际空港逃出这个国家. 该国有N个城市,城市之间有道路相连.一共有M条双向道路.保证没有自环和重边. K个城市已经被僵 ...

  9. JavaScript滚动条的制作

    效果演示   这个效果的制作是借助setTimeout的第三个参数.setTimeout/setInterval,这两个函数相信前端开发同学都很熟悉.它们在非IE(6-9)浏览器中还可以如下使用: v ...

  10. HDU 4771 (DFS+BFS)

    Problem Description Harry Potter has some precious. For example, his invisible robe, his wand and hi ...