码迷,mamicode.com
首页 > Web开发 > 详细

BZOJ 1015 [JSOI2008]星球大战starwar

时间:2017-09-23 20:14:07      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:若是   连通   gif   src   维护   nbsp   scanf   turn   技术   

今天效率终极无敌低。

一开始没读懂题。给你一张图,每次删除一个点和该点连出的边,问每次删除后未被删除的点构成的图的连通块的个数。

考虑倒着做,先把所有点删完,每次往图中加点,并查集维护连通块,每加进一个点ans++,然后找它的边,若是连出的点和它不在同一个并查集中,合并,ans--;

第一次找连通块的时候我暴力合并然后把所有并查集的代表元拿出来去了个重,一开始忘排序了wa成zz。。。。

技术分享
//Twenty
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<vector>
typedef long long LL;
const int maxn=200000*2;
using namespace std;
int n,m,sz,fa[maxn],fir[maxn],nxt[maxn],to[maxn],q[maxn],k,ecnt,no[maxn],que[maxn],ans[maxn];
void add(int u,int v) {
    nxt[++ecnt]=fir[u]; fir[u]=ecnt; to[ecnt]=v;
    nxt[++ecnt]=fir[v]; fir[v]=ecnt; to[ecnt]=u;
}
int find(int x) {return x==fa[x]?x:fa[x]=find(fa[x]);}
void init() {
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++) {
        int u,v;
        scanf("%d%d",&u,&v);
        add(u,v);
    }
    scanf("%d",&k);
    for(int i=1;i<=k;i++) {
        scanf("%d",&q[i]);
        no[q[i]]=1;
    }
}
void work() {
    int now=0;
    for(int i=0;i<n;i++) fa[i]=i;
    for(int i=0;i<n;i++) if(!no[i]){
        for(int j=fir[i];j;j=nxt[j]) if(!no[to[j]]) {
            int u=find(i),v=find(to[j]);
            if(u!=v) {
                fa[v]=u;
            }
        }
    }
    for(int i=0;i<n;i++) if(!no[i]){
         int u=find(i);
         que[++sz]=u;
    }
    sort(que+1,que+sz+1); 
    int tpsz=0;
    for(int i=1;i<=sz;i++) {
         if(i==1||que[i]!=que[i-1]) tpsz++;
    }
    sz=tpsz; now=sz;
    ans[k]=sz;
    for(int i=k;i>=1;i--) {
        no[q[i]]=0; now++;
        for(int j=fir[q[i]];j;j=nxt[j]) if(!no[to[j]]){
           int u=find(q[i]),v=find(to[j]);
           if(u!=v) {
               now--;
               fa[u]=v;
           } 
        }
        ans[i-1]=now;
    }
    for(int i=0;i<=k;i++) printf("%d\n",ans[i]);    
}
int main()
{
    init();
    work();
    return 0;
}
View Code

 

BZOJ 1015 [JSOI2008]星球大战starwar

标签:若是   连通   gif   src   维护   nbsp   scanf   turn   技术   

原文地址:http://www.cnblogs.com/Achenchen/p/7581901.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!