zoukankan      html  css  js  c++  java
  • JSOI2008星球大战(并查集)

    膜拜HZWER大牛的编码能力!

    附上他的代码(我的代码不知为何一直莫名出错……)

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int tot,n,m,d,father[400001],head[400001],q[400001],ans[400001],cnt=1;
    bool used[400001],des[400001];
    struct data{int to,next;}e[400001];
    int find(int x){return x==father[x]?x:father[x]=find(father[x]);}
    void ins(int u,int v)
    {
         cnt++;e[cnt].to=v;e[cnt].next=head[u];head[u]=cnt;
         cnt++;e[cnt].to=u;e[cnt].next=head[v];head[v]=cnt;
     }
    void add(int x)
    {
        int i=head[x],p=find(x),q;
        while(i)
        {
            if(used[e[i].to])
            {
                 q=find(e[i].to);
                 if(p!=q){father[q]=p;tot--;}
            }
            i=e[i].next;
                } 
     }
    int main()
    {
        scanf("%d%d",&n,&m);
        for(int i=0;i<n;i++)father[i]=i;
        for(int i=1;i<=m;i++)
        {
                int x,y;
                scanf("%d%d",&x,&y);
                ins(x,y);
                }
        scanf("%d",&d);
        for(int i=1;i<=d;i++)
        {
                scanf("%d",&q[i]);
                des[q[i]]=1; 
                }
        for(int i=0;i<n;i++)
        {
            if(!des[i])
            {
                       tot++;
                       add(i);
                       used[i]=1;
            }
        }
        ans[d+1]=tot;
        for(int i=d;i>0;i--)
        {
                tot++;
                add(q[i]);
                used[q[i]]=1;
                ans[i]=tot;
                }
        for(int i=1;i<=d+1;i++)printf("%d
    ",ans[i]);
        return 0;
    }
  • 相关阅读:
    Ubuntu安装GTK+教程
    Qt 错误GL/gl.h: No such file or directory的解决方法
    Qt 解决Could not start process "make" qmake_all问题
    Feign解决服务之间调用传递token
    python闭包和装饰器
    python高阶函数
    ping 和 traceroute 的区别
    ICMP协议
    OSPF协议
    RIP协议
  • 原文地址:https://www.cnblogs.com/zyfzyf/p/3764064.html
Copyright © 2011-2022 走看看