星球联盟
来源:互联网 发布:上帝之眼网络摄像作品 编辑:程序博客网 时间:2024/04/27 17:52
题目描述
在遥远的S星系中一共有N个星球,编号为1…N。其中的一些星球决定组成联盟,以方便相互间的交流。
但是,组成联盟的首要条件就是交通条件。初始时,在这N个星球间有M条太空隧道。每条太空隧道连接两个星球,使得它们能够相互到达。若两个星球属于同一个联盟,则必须存在一条环形线路经过这两个星球,即两个星球间存在两条没有公共隧道的路径。
为了壮大联盟的队伍,这些星球将建设P条新的太空隧道。这P条新隧道将按顺序依次建成。一条新轨道建成后,可能会使一些星球属于同一个联盟。你的任务是计算出,在一条新隧道建设完毕后,判断这条新轨道连接的两个星球是否属于同一个联盟,如果属于同一个联盟就计算出这个联盟中有多少个星球。
输入
第1行三个整数N,M和P,分别表示总星球数,初始时太空隧道的数目和即将建设的轨道数目。
第2至第M+1行,每行两个整数,表示初始时的每条太空隧道连接的两个星球编号。
第M+2行至第M+P+1行,每行两个整数,表示新建的太空隧道连接的两个星球编号。这些太空隧道按照输入的顺序依次建成。
输出
输出共P行。如果这条新的太空隧道连接的两个星球属于同一个联盟,就输出一个整数,表示这两个星球所在联盟的星球数。如果这条新的太空隧道连接的两个星球不属于同一个联盟,就输出”No”(不含引号)。
样例输入
3 2 1
1 2
1 3
2 3
样例输出
3
提示
【样例1说明】
新建成的隧道连接2、3两个星球。
这条隧道1和2,2和3,1和3之间都存在环形线路。1,2,3同属一个联盟,答案为3
【样例2】
alliance.in
alliance.out
5 3 4
1 2
4 3
4 5
2 3
1 3
4 5
2 4
No
3
2
5
【数据范围】
对于10%的数据有1≤N,M,P≤100;
对于40%的数据有1≤N,M,P≤2000;
对于100%的数据有1≤N,M,P≤200000。
我们考虑把原问题转换成树上加边的问题,如果加上这条边之前两个点不联通,那就必然不可能成为联盟,直接输出No。如果加边前为联通,那么我们可以采用并查集的方式维护联盟的个数(感觉写不清楚啊QaQ)。打个比方,在一棵树上给x,y两点之间加一条边,那么x到lca(x,y)与y到lca(x,y)之间这条路径就形成了一个环,然后我们根据深度维护一下并查集,就是把x,y都并到他们的祖先上就可以了(不懂就看一下代码吧)。
vartot,i,n,m,p:longint;f,g,c,u,v,dis,head,ret,next,h,d,pre:array[0..400044] of longint;flag,fl:array[0..400044] of boolean;procedure ins(u,v:longint);begin tot:=tot+1; ret[tot]:=v; next[tot]:=head[u]; head[u]:=tot;end;function find(i:longint):longint;begin if f[i]<>i then f[i]:=find(f[i]); exit(f[i]);end;procedure build;vari,root1,root2:longint;begin for i:=1 to n do f[i]:=i; for i:=1 to m do begin root1:=find(u[i]); root2:=find(v[i]); if root1<>root2 then begin ins(u[i],v[i]); ins(v[i],u[i]); fl[i]:=true; f[root1]:=root2; end; end; for i:=1 to p do begin root1:=find(g[i]); root2:=find(c[i]); if root1<>root2 then begin ins(g[i],c[i]); ins(c[i],g[i]); flag[i]:=true; f[root1]:=root2; end; end;end;procedure bfs;vari,u,v,st,ed,j:longint;begin for i:=1 to n do if h[i]=0 then begin st:=0; ed:=1; d[1]:=i; h[i]:=1; pre[i]:=i; while st<ed do begin st:=st+1; u:=d[st]; j:=head[u]; while j<>0 do begin v:=ret[j]; if h[v]=0 then begin ed:=ed+1; d[ed]:=v; pre[v]:=u; h[v]:=h[u]+1; end; j:=next[j]; end; end; end;end;function ansesstor(u,v:longint):longint;varroot1,root2,t:longint;begin root1:=find(u); root2:=find(v); if root1=root2 then exit(root1); if h[root1]<h[root2] then begin t:=ansesstor(root1,pre[root2]); f[root2]:=t; dis[t]:=dis[t]+dis[root2]; end else begin t:=ansesstor(pre[root1],root2); f[root1]:=t; dis[t]:=dis[t]+dis[root1]; end; exit(t);end;procedure solve;vari,fa:longint;begin for i:=1 to n do begin f[i]:=i; dis[i]:=1; end; for i:=1 to m do if fl[i]=false then ansesstor(u[i],v[i]); for i:=1 to p do begin if flag[i] then begin writeln('No'); continue; end; fa:=ansesstor(g[i],c[i]); writeln(dis[fa]); end;end;begin readln(n,m,p); for i:=1 to m do readln(u[i],v[i]); for i:=1 to p do readln(g[i],c[i]); build; bfs; solve;end.
- 星球联盟
- 星球联盟
- 星球联盟
- 【JZOJ3875】星球联盟(alliance)
- 【JZOJ 3875】 星球联盟
- 【JZOJ 3875】星球联盟
- 【jzoj3875】【星球联盟】【树】【并查集】
- Problem C: 星球联盟(并查集+lca)
- 【JZOJ3875】【NOIP2014八校联考第4场第2试10.20】星球联盟(alliance)
- JZOJ 3875. 【NOIP2014八校联考第4场第2试10.20】星球联盟(alliance)
- 【NOIP2014八校联考第4场第2试10.20】星球联盟(alliance)
- 【JZOJ3875】【NOIP2014八校联考第4场第2试10.20】星球联盟(alliance)
- 联盟
- 2017.08.20【NOIP提高组】模拟赛B组 【NOIP2014八校联考第4场第2试10.20】星球联盟(alliance)
- [jzoj]3875. 【NOIP2014八校联考第4场第2试10.20】星球联盟(alliance)(图论题,构树+缩点+LCA+并查集)
- 电子星球
- B612星球
- [codeforces229B]星球
- 数据库范式学习之2,3,BCNF
- 8 nested panic
- Ajax上传图片为空
- SBT - Library Dependencies
- websoket的简单应用
- 星球联盟
- 服装店老板娘都会的高级营销策略,不看后悔
- 快速开发框架
- office2003 找不到必需的安装文件sku011.cab
- Android-设置默认横屏显示
- 进阶篇: ramdump分析--9 ram dump文件种类
- Cocos2d-x制作三消类游戏
- linux下安装mysql(rpm)方式安装
- Linux下如何查看tomcat是否启动