1015: [JSOI2008]星球大战starwar

Time Limit: 3 Sec  Memory Limit: 162 MB
Submit: 2124  Solved: 909
[Submit][Status]

Description

很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系。某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球。这些星球通过特殊的以太隧道互相直接或间接地连接。 但好景不长,很快帝国又重新造出了他的超级武器。凭借这超级武器的力量,帝国开始有计划地摧毁反抗军占领的星球。由于星球的不断被摧毁,两个星球之间的通讯通道也开始不可靠起来。现在,反抗军首领交给你一个任务:给出原来两个星球之间的以太隧道连通情况以及帝国打击的星球顺序,以尽量快的速度求出每一次打击之后反抗军占据的星球的连通快的个数。(如果两个星球可以通过现存的以太通道直接或间接地连通,则这两个星球在同一个连通块中)。

Input

输入文件第一行包含两个整数,N (1 <= N <= 2M) 和M (1 <= M <= 200,000),分别表示星球的数目和以太隧道的数目。星球用0~N-1的整数编号。接下来的M行,每行包括两个整数X, Y,其中(0<=X<>Y

Output

输出文件的第一行是开始时星球的连通块个数。接下来的N行,每行一个整数,表示经过该次打击后现存星球的连通块个数。

Sample Input

8 13
0 1
1 6
6 5
5 0
0 6
1 2
2 3
3 4
4 5
7 1
7 2
7 6
3 6
5
1
6
3
5
7

Sample Output

1
1
1
2
3
3

HINT

 

Source

一句话题意:对于一张无向图,每次删除一个点,在线求当前联通块数目

分析:无向图求联通块如果没有修改(删点)大家都知道用并查集搞,但有修改怎么办呢?貌似删除一个点并查集好像无法简单维护!!!

逆向思维!!!!!!!!!!!!!!!!!!!!!!!!

按顺序删除一些点等价于反向加入这些点!

于是思路就很明朗了,删除这些点的问题可以转换成倒序把他们加到图中间

题解:

1、先读入,将准备删除的点打标记(visit[i]=1表示i点是要准备删除的)

2、将那些没有打标记的点搞并查集

3、统计目前并查集中联通块的个数(搞个Hash表,然后扫一遍计数)作为answer[len](len为要删除的点的个数),并且把第len个点和对应的边加入并查集搞一下

4、以此类推搞len-1

好吧我语文太差看程序吧

code

 #include<cstdio>
 #include<cstring>
 #include<algorithm>
 #include<vector>
 using namespace std;
 ;
 ;
 vector<];
 ],a[maxn+],f[maxn+],n,m,len;
 ],visit[maxn+];
 int find(int x)
 {
     if(f[x]==x) return f[x];
     return f[x]=find(f[x]);
 }
 int main()
 {
     freopen("ce.in","r",stdin);
     freopen("ce.out","w",stdout);
     scanf("%d%d",&n,&m);
     ;i<=n;++i) g[i].clear();
     ;i<=m;++i)
     {
         int x,y;
         scanf("%d%d",&x,&y);
         g[x].push_back(y);
         g[y].push_back(x);
     }
     scanf("%d",&len);
     ;i<=len;++i) scanf("%d",&q[i]);
     memset(visit,,sizeof(visit));
     ;i<=len;++i) visit[q[i]]=;
     ;i<n;++i) f[i]=i;
     ;i<n;++i)
         )
             ;j<g[i].size();++j)
                 )
                 {
                     int x=find(i),y=find(g[i][j]);
                     if(x!=y) f[y]=x;
                 }
     a[len]=;
     memset(p,,sizeof(p));
     ;i<n;++i)
         ) p[find(i)]=;
     ;i<n;++i) ) ++a[len];
     ;k>=;--k)
     {
         visit[q[k+]]=;
         a[k]=a[k+]+;
         ;i<g[q[k+]].size();++i)
             ]][i]]==)
             {
                 ]),y=find(g[q[k+]][i]);
                 if(x!=y) f[y]=x,a[k]--;
             }
     }
     ;i<=len;++i) printf("%d\n",a[i]);
     ;
 }

随机推荐

  1. Discuz NT 架构剖析之Config机制

    接触了Discuz NT! 一段时间了,是时候做个总结了,标题好霸气,有木有? 都是托园子里的大牛代振军的福啊,哈哈哈哈. 首先论坛的信息不是完全存储在数据库里面的,一部分信息存储在config文件里 ...

  2. js正则表达式大全(1)

    正则表达式中的特殊字符 \ 做为转意,即通常在"\"后面的字符不按原来意义解释,如/b/匹配字符"b",当b前面加了反斜杆后/\b/,转意为匹配一个单词的边界. ...

  3. 读取DBF文件数据

    #region 返回DBF表 public static System.Data.DataTable getDTFromDBF(string fullPath) { string pDir = Sys ...

  4. win32 COM组件编写

    win32的com组件: 1. 编辑idl,idl文件会生成对应的com class和com interface,例如 [ object, uuid(xxxxxxxx-xxxx-xxxx-xxxx-x ...

  5. [水煮 ASP.NET Web API2 方法论](3-9)空气路由的设置

    阅读导航 问题 解决方案 工作原理 代码演示 在此解释一下,空气路由,是本人臆想出来,觉着更能表达 IgnoreRoute 的意图,如果看着辣眼睛^^,请见谅. 问题 我们在之定义过集中式路由,集中式 ...

  6. mysql 根据某些字段之和排序

    在自己项目中记录了比赛球队获得金银铜牌的具体奖牌数,遇到需求是按照奖牌个数排序 select a.RANK_ID,a.COUNTRY,a.GOLD,a.SILVER,a.BRONZE,a.ICON,a ...

  7. 关于HTTP的几种

    301.404.200.304等HTTP状态,代表什么意思? 如果某项请求发送到您的服务器要求显示您网站上的某个网页(例如,用户通过浏览器访问您的网页或 Googlebot 抓取网页时),服务器将会返 ...

  8. C#人爱学不学9[C#5.0异步实例+WPF自己的MVVM Async应用 1/12]

    文章摘要: 1. 通过简单DEMO.让读者理解Task和Task<T>    学习过程中,掌握async和await 2. 理解同步和异步的执行 3. Task.Factory.Start ...

  9. android 开启或者隐藏软键盘

    一. 隐藏软键盘方法一(注:此方法本人使用时发现isActivie()失效,建议还是用其他方法..): InputMethodManager imm = (InputMethodManager)get ...

  10. running android lint has encountered a problem

    最近写学习android编程的的时候,每次保存.java文件的时候,总会跳出如下错误 解决: