首页 > 其他分享 >P1197 [JSOI2008] 星球大战

P1197 [JSOI2008] 星球大战

时间:2024-02-24 18:33:48浏览次数:15  
标签:星球大战 400005 int JSOI2008 next fa now finds P1197

原题链接

题解,请看题解区第一篇,看一遍就会了

code

#include<bits/stdc++.h>
using namespace std;
int fa[400005]={0};
int finds(int now)
{
    return fa[now]=(fa[now]==now?now:finds(fa[now]));
}
vector<int> G[400005];
int broke[400005];
int Broke[400005]={0};
int main()
{
    int n,m;
    cin>>n>>m;

    for(int i=1;i<=n;i++)fa[i]=i;

    for(int i=1;i<=m;i++)
    {
        int x,y;
        cin>>x>>y;
        G[x].push_back(y);
        G[y].push_back(x);
    }

    int k;
    cin>>k;
    for(int i=1;i<=k;i++)
    {
        cin>>broke[i];//代表被摧毁星球的下标
        Broke[broke[i]]=1;//代表当前是否被摧毁
    }

    int sec=n-k;//代表连通块数量

    for(int i=1;i<=n;i++)
    {
        if(!Broke[i])
        {
            for(auto next:G[i])
            {
                if(!Broke[next]&&finds(i)!=finds(next))//如果相连的星球没有被摧毁,且两者属于不同连通块
                {
                    sec--;//连通块个数减少
                    fa[finds(next)]=finds(i);//就把他们连在一起
                }
            }
        }
    }

    int ans[k+5]={0};
    ans[k]=sec;//代表摧毁i个星球后连通块个数
    for(int i=k;i>=1;i--)
    {
        sec++;
        int now=broke[i];
        for(auto next:G[now])
        {
            if(!Broke[next]&&finds(now)!=finds(next))
            {
                sec--;
                fa[finds(next)]=finds(now);
            }
        }
        Broke[now]=0;//细节,建立之后就相当于没被摧毁了
        ans[i-1]=sec;
    }
    for(int i=0;i<=k;i++)
        cout<<ans[i]<<endl;
    return 0;
}


标签:星球大战,400005,int,JSOI2008,next,fa,now,finds,P1197
From: https://www.cnblogs.com/pure4knowledge/p/18031415

相关文章

  • P1198 [JSOI2008] 最大数
    原题链接题解1:单调栈+并查集?单调栈特性:栈内元素大小和序号由栈底到栈顶具有单调性,本题大小单调减,序号单调增维护:新元素入栈时,栈内剩余的所有小于该元素的元素出栈,并视新元素为集合首领,然后新元素入栈查询:查询集合首领即可code1#definelllonglong#include<bits/stdc++.h>......
  • P1197 [JSOI2008] 星球大战 题解
    P1197[JSOI2008]星球大战题解题目链接P1197[JSOI2008]星球大战简要思路看完题目的第一印象是——连通性。图论中判断连通性很容易想到并查集,但是并查集只支持合并和查询,并不支持删除,怎么办呢?考虑逆向思维,把删点的过程倒过来,看成加点和连边,那么此题就可以非常方便的用并......
  • 「JSOI2008」最小生成树计数 题解报告
    简要题意现在给出了一个简单无向加权图。你希望知道这个图中有多少个不同的最小生成树。(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的)。输出方案数对\(31011\)取模。SOLUTION这个题求最小生成树的方案所以我们从最小生成树入手(根据kruskal的思路)我们......
  • P4036 [JSOI2008] 火星人
    暴力水过了wwwwwwwwwwwwwww#include<bits/stdc++.h>//================================================//#defineLOCALFLANDREKAWAII#ifndefLOCALconstexprintSIZE(1<<20);charin[SIZE],out[SIZE],*p1=in,*p2=in,*p3=out;#definegetchar(......
  • P4035 [JSOI2008]球形空间产生器
    A,B,球心坐标分别为\((a_1,a_2,a_3....),(b_1,b_2,b_3....),(c_1,c_2,c_3....)\)则\(dist^2=(a_1-c_1)^2+(a_2-c_2)^2+(a_3-c_3)^2\)......\(=(b_1-c_1)^2+(b_2-c_2)^2......
  • P1198 JSOI2008 最大数
    P1198JSOI2008最大数-洛谷|计算机科学教育新生态(luogu.com.cn)采用ST表维护RMQ。对于插入操作,设插入后数列长度变为\(n\),我们只需重新修改满足\(i+2^j-......
  • BZOJ 1012: [JSOI2008]最大数maxnumber
    题目链接:​​传送门​​时隔一年再写一遍#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<complex>#include<algorithm>#include<cl......
  • BZOJ 1013([JSOI2008]球形空间产生器sphere-gauss消元练习)
    1013:[JSOI2008]球形空间产生器sphereTimeLimit: 1Sec  MemoryLimit: 162MBSubmit: 1181  Solved: 654[​​Submit​​][​​Status​​][​​Discu......
  • NC235267 星球大战
    题目原题地址:星球大战题目编号:NC235267题目类型:map、list时间限制:C/C++2秒,其他语言4秒空间限制:C/C++262144K,其他语言524288K1.题目大意二维平面上n个坐标对应......