博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj 1015 并查集
阅读量:6884 次
发布时间:2019-06-27

本文共 2304 字,大约阅读时间需要 7 分钟。

逆向思维,先将整张图以最后所有要求的点毁掉的状态建图,然后倒着

加点就行了,用并查集维护连通块

/**************************************************************    Problem: 1015    User: BLADEVIL    Language: Pascal    Result: Accepted    Time:2588 ms    Memory:16340 kb****************************************************************/ //By BLADEVILvar    n, m, k                     :longint;    flag                        :array[0..500010] of boolean;    pre, other, last            :array[0..500010] of longint;    delete, x, y, ans           :array[0..500010] of longint;    father                      :array[0..500010] of longint;    l                           :longint;          procedure connect(x,y:longint);begin    inc(l);    pre[l]:=last[x];    last[x]:=l;    other[l]:=y;end; procedure init;var    i                           :longint;begin    read(n,m);    for i:=1 to m do    begin        read(x[i],y[i]);        connect(x[i],y[i]);        connect(y[i],x[i]);    end;    read(k);    for i:=1 to k do    begin        read(delete[i]);        flag[delete[i]]:=true;    end;end; function getfather(x:longint):longint;begin    if father[x]=x then exit(x);    father[x]:=getfather(father[x]);    exit(father[x]);end; procedure main;var    i                           :longint;    fa, fb                      :longint;    cur                         :longint;    q, p                        :longint;     begin    for i:=0 to n-1 do father[i]:=i;     for i:=1 to m do    begin        if (not flag[x[i]]) and (not flag[y[i]]) then        begin            fa:=getfather(x[i]); fb:=getfather(y[i]);            if fa<>fb then father[fa]:=fb;        end;    end;    for i:=0 to n do if (not flag[i]) and (father[i]=i) then inc(ans[k+1]);     for i:=k downto 1 do    begin        cur:=delete[i];        ans[i]:=ans[i+1];        q:=last[cur];        inc(ans[i]);        while q<>0 do        begin            p:=other[q];            if not flag[p] then            begin                  fa:=getfather(p);                if fa<>cur then                begin                    dec(ans[i]);                    father[fa]:=cur;                end;            end;            q:=pre[q];        end;        flag[cur]:=false;    end;    for i:=1 to k+1 do writeln(ans[i]);end;  begin    init;    main;end.

 

转载于:https://www.cnblogs.com/BLADEVIL/p/3496046.html

你可能感兴趣的文章
Python实践之(七)逻辑回归(Logistic Regression)
查看>>
PAT (Advanced Level) 1107. Social Clusters (30)
查看>>
【开源社群系统研发日记五】ThinkSNS+ 是如何计算字符显示长度的
查看>>
Nodejs日志管理log4js
查看>>
python获取昨日日期
查看>>
海康威视 - 萤石云开放平台 js 版
查看>>
关于分销平台
查看>>
剑指offer---12-**--数值的整数次方
查看>>
PAT - L2-010. 排座位(并查集)
查看>>
Linux下chkconfig命令详解(转)
查看>>
EF中,保存实体报错:Validation failed for one or more entities. 如何知道具体错误在哪?...
查看>>
和积式
查看>>
你不能错过.net 并发解决方案
查看>>
[PHP] 超全局变量$_FILES上传文件
查看>>
linux如何添加telnet服务
查看>>
解决Windows对JDK默认版本切换问题
查看>>
HTML5本地存储localStorage与seesionStorage
查看>>
06笨小猴(1.9)
查看>>
UNIX网络编程——原始套接字的魔力【上】
查看>>
web应用开发技术(第二版)崔尚森第八章部分作业
查看>>