题目:https://www.luogu.org/problemnew/show/1197

此题不能按时间顺序进行删点、求连通块数量,而应打破时间的思维,先形成一张没有要删去的点的图,再从后往前逐个加点,存储连通块数量;

这样将删点问题转化为倒序的加点问题,通过并查集快速求出新图中连通块数量。

代码如下:

#include<iostream>
#include<cstdio>
using namespace std;
int n,m,k,a,b,ct,cnt[400005],pla[400005],fa[400005],ans[400005],s;
bool c[400005];
struct N{
int to;int next;
}edge[400005];
int find(int x)
{
if(fa[x]==x)return x;
else return fa[x]=find(fa[x]);
}
void add(int x,int y)
{
ct++;
edge[ct].to=y;
edge[ct].next=cnt[x];
cnt[x]=ct;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
add(a,b);add(b,a);
}
scanf("%d",&k);
for(int i=1;i<=k;i++)
scanf("%d",&pla[i]),c[pla[i]]=1;
s=n-k;
for(int i=0;i<n;i++)fa[i]=i;
for(int i=0;i<n;i++)
{
if(c[i])continue;
for(int j=cnt[i];j;j=edge[j].next)
{
if(c[edge[j].to])continue;
int v=find(edge[j].to);
int u=find(i);
if(u!=v)fa[u]=v,s--;
}
}
for(int i=k;i>=1;i--)
{
ans[i]=s;c[pla[i]]=0;s++;
for(int j=cnt[pla[i]];j;j=edge[j].next)
{
if(c[edge[j].to])continue;
int v=find(edge[j].to);
int u=find(pla[i]);
if(u!=v)fa[u]=v,s--;
}
}
printf("%d\n",s);
for(int i=1;i<=k;i++)
printf("%d\n",ans[i]);
return 0;
}

  

JSOI2008星球大战——联通块数量的更多相关文章

  1. 【UVA10765】Doves and bombs (BCC求割点后联通块数量)

    题目: 题意: 给了一个联通无向图,现在问去掉某个点,会让图变成几个联通块? 输出的按分出的从多到小,若相等,输出标号从小到大.输出M个. 分析: BCC求割点后联通块数量,Tarjan算法. 联通块 ...

  2. POJ-3107 Godfather 求每个节点连接的联通块数量

    dp[n][2],维护儿子的联通块数量和父亲的联通块数量. 第一遍dfs求儿子,第二遍dfs求爸爸. #include<iostream> #include<cstring> ...

  3. 【反向并查集、联通图】P1197 [JSOI2008]星球大战

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

  4. BZOJ 1015:[JSOI2008]星球大战starwar(逆向处理+并查集)

    [JSOI2008]星球大战starwar                                                时间限制: 3 Sec 内存限制: 162 MB[题目描述] ...

  5. P1197 [JSOI2008]星球大战[并查集+图论]

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

  6. [JSOI2008]星球大战starwar

    嘟嘟嘟 维护联通块自然想到并查集,然而题中说是删边,不是很好做,因此我们可以离线下来然后倒序操作,就变成了添加边的同时维护联通块数量. 首先我们把k次打击后剩的边都添加到图中,表示倒序时的初始状态.然 ...

  7. [洛谷P1197/BZOJ1015][JSOI2008]星球大战Starwar - 并查集,离线,联通块

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

  8. P1197 [JSOI2008]星球大战(并查集判断连通块+正难则反)

    P1197 [JSOI2008]星球大战(并查集判断连通块+正难则反) 并查集本来就是连一对不同父亲的节点就的话连通块就少一个. 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统 ...

  9. 分别利用并查集,DFS和BFS方法求联通块的数量

    联通块是指给定n个点,输入a,b(1<=a,b<=n),然后将a,b连接,凡是连接在一起的所有数就是一个联通块: 题意:第一行输入n,m,分别表示有n个数,有输入m对连接点,以下将要输入m ...

随机推荐

  1. requestWindowFeature使用详解

    requestWindowFeature可以设置的值有: // 1.DEFAULT_FEATURES:系统默认状态,一般不需要指定        // 2.FEATURE_CONTEXT_MENU:启 ...

  2. 输入一个n,输出2到n的详细素数值

    #include<stdio.h> #include<algorithm> #include<cmath> int judge(int a) { int j; fo ...

  3. [Linux] 概念

    操作系统包括: 内核:管理硬件资源 库:没有执行入口的程序,用于提升软件开发效率 应用程序:有执行入口的程序 常见库文件: windows系统:dll(dynamic link library)动态链 ...

  4. PowerBuilder -- 变更某列的背景色

    记得把background.mode设置为2 li_col++ ls_col[li_col] = ls_fit_no ls_column = ' col' + String(li_col) ls_co ...

  5. CentOS7时间设置及ntp同步配置(转)

    出处:http://www.centoscn.com/CentOS/config/2015/1105/6385.html http://www.centoscn.com/CentOS/config/2 ...

  6. 如何在linux下解压缩rar格式的文件压缩包

    ##########################################################如何在linux下解压缩rar格式的文件压缩包#date:2014年2月15日22: ...

  7. MongoDB 基本操作具体解释

    MongoDB 最大的特点是他支持的查询语言很强大,其语法有点类似于面向对象的查询语 言.差点儿能够实现类似关系数据库单表查询的绝大部分功能,并且还支持对数据建立索引. 最后因为 MongoDB 能够 ...

  8. POJ3182 The Grove[射线法+分层图最短路]

    The Grove Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 904   Accepted: 444 Descripti ...

  9. 【BZOJ2457】[BeiJing2011]双端队列 贪心+模拟

    [BZOJ2457][BeiJing2011]双端队列 Description        Sherry现在碰到了一个棘手的问题,有N个整数需要排序.        Sherry手头能用的工具就是若 ...

  10. Tomcat Server 配置

    Tomcat报错: The JRE could not be found. Edit the server and change the JRE location. EClipse -> win ...