寒假刷題34:洛谷P1197 [JSOI2008]星球大戰(並查集)

題目鏈接:

洛谷P1197 [JSOI2008]星球大戰

題目解析:

離線以後逆序操作

AC代碼:

#include<iostream>
#include<cstring>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
const int MAXN=200005;
int n,m,fa[MAXN*2],k,vis[MAXN*2],ans[2*MAXN],num;

struct plant
{
    int x,y,c;
    bool operator <(const plant b)const{return c<b.c;}
}a[MAXN];
bool mycmp(plant x,plant y)
{
    return x.c<y.c;
}
int getfa(int x){return fa[x]==x?x:fa[x]=getfa(fa[x]);}
void mer(int x,int y){
    int fx=getfa(x),fy=getfa(y);
    if(fx!=fy) fa[fx]=fy,num--;
}
int main()
{
    cin>>n>>m;
    num=n;
    for(int i=0;i<n;i++) fa[i]=i;
    for(int i=1;i<=m;i++)
    {
        cin>>a[i].x>>a[i].y;
        a[i].c=0;
    }
    cin>>k;
    int temp;
    for(int i=1;i<=k;i++)
    {
        cin>>temp;
        vis[temp]=k-i+1;
    }
    for(int i=1;i<=m;i++) a[i].c=max(vis[a[i].x],vis[a[i].y]);
    sort(a+1,a+1+m);
    for(int i=0,j=1;i<=k;i++)
    {
        for(;a[j].c==i;j++) mer(a[j].x,a[j].y);
        ans[i]=num-(k-i);
    }
    for(int i=k;i>=0;i--) cout<<ans[i]<<endl;;
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章