分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 技术分享

BZOJ 1015 JSOI2008 星球大战

发布时间:2023-09-06 01:09责任编辑:苏小强关键词:暂无标签

题目的关键点在于读入后,倒着进行并查集操作。
因为并查集不支持删点操作,所以读入后。按照顺序,逆着操作就可以了。

#include <cstdio>#include <vector>#include <algorithm>using namespace std; vector<int>Edge[400005];int x,y,n,m;int k,ban[200005];int fa[400005];bool vis[400005];int tot;int ask[200005]; int find(int x){    if(x!=fa[x]) fa[x]=find(fa[x]);    return fa[x];} void un(int x,int y){    int fx = find(x);    int fy = find(y);    //printf("%d %d %d %d\n",fx,fy,x,y);    if(fx!=fy) tot--,fa[fy]=fx;} int main(){    scanf("%d%d",&n,&m);    for(int i=1;i<=m;i++){        scanf("%d%d",&x,&y);        x++;        y++;        Edge[x].push_back(y);        Edge[y].push_back(x);    }    for(int i=1;i<=n;i++) fa[i]=i;    scanf("%d",&k);    for(int i=1;i<=k;i++) scanf("%d",&ban[i]),ban[i]++,vis[ban[i]]=1;    tot = n-k;    for(int i=1;i<=n;i++){        if(vis[i]) continue;        for(int v=0;v<Edge[i].size();v++){            if(vis[Edge[i][v]]) continue;            un(i,Edge[i][v]);        }    }         ask[k+1]=tot;    for(int i=k;i;i--){        vis[ban[i]]=0;        ++tot;        for(int v=0;v<Edge[ban[i]].size();v++){            //printf("Edge[ban[i]][v]:%d\n",Edge[ban[i]][v]);            if(!vis[Edge[ban[i]][v]]) un(ban[i],Edge[ban[i]][v]);        }        ask[i]=tot;    }    //printf("\n");         for(int i=1;i<=k+1;i++){        printf("%d\n",ask[i]);    }    return 0;}

BZOJ 1015 JSOI2008 星球大战

原文地址:http://www.cnblogs.com/OIerLYF/p/7496112.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved