[并查集+路径压缩]zoj 3261:Connections in Galaxy War
2011-12-10 09:59
309 查看
大致题意:
给出n个点和每个点的能量值,再在这些点中加上m条边。接下来进行k步操作,每步操作可以拆掉一条边或者查询和某个点连接的能量最大点的编号。
大致思路:
先完成所有的建边和拆边操作。接着从k步操作中的最后一步开始向前,如果是拆边操作则把拆去的边重新加回去,如果是查询,则寻找这个点所在集合中能量值最大的点。
详细代码:
给出n个点和每个点的能量值,再在这些点中加上m条边。接下来进行k步操作,每步操作可以拆掉一条边或者查询和某个点连接的能量最大点的编号。
大致思路:
先完成所有的建边和拆边操作。接着从k步操作中的最后一步开始向前,如果是拆边操作则把拆去的边重新加回去,如果是查询,则寻找这个点所在集合中能量值最大的点。
详细代码:
#include<iostream> #include<cstring> #include<cstdio> using namespace std; const int nMax=100005; const int mMax=1000005; int n,father[nMax],rank[nMax],m,sum; //rank近似树的高度。 class edge{ public: int u,v,nex,flag; };edge e[mMax]; int k,head[nMax]; void addedge(int a,int b){//向图中加边的算法,注意加上的是有向边//b为a的后续节点既是a---->b e[k].u=a; e[k].v=b; e[k].nex=head[a]; e[k].flag=1; head[a]=k;k++; } void del(int a,int b){ for(int i=head[a];i;i=e[i].nex){ if(e[i].v==b){ e[i].flag=0; } } } int find(int x){ // 寻找父节点 if(x!=father[x]) return father[x]=find(father[x]); return x; } void unio(int a,int b){ int x=find(a); int y=find(b); if(x==y)return; if(rank[x]==rank[y]){ if (x<y)father[y]=x; else father[x]=y; return; } if(rank[x]>rank[y])father[y]=x; else father[x]=y; } void set(){ // 初始化 int i; for(i=0; i<nMax-1; i++){ father[i]=i; } } class cmd{ public: char ope[100]; int a,b; }list[nMax]; int ans[nMax]; int main(){ int i,a,b,q,f=0; while(scanf("%d",&n)!=EOF){ if(f==1) printf("\n"); f=1; set(); k=1; memset(head,0,sizeof(head)); for(i=0;i<n;i++){ scanf("%d",&rank[i]); } scanf("%d",&m); while(m--){ scanf("%d%d",&a,&b); if(a>b)swap(a,b); addedge(a,b); } scanf("%d",&q); for(i=0;i<q;i++){ scanf("%s",list[i].ope); if(list[i].ope[0]=='d'){ scanf("%d%d",&a,&b); if(a>b)swap(a,b); list[i].a=a; list[i].b=b; del(a,b); } else{ scanf("%d",&list[i].a); } } for(i=1;i<k;i++){ if(e[i].flag){ unio(e[i].u,e[i].v); } } int N=0; for(i=q-1;i>=0;i--){ if(list[i].ope[0]=='d'){ unio(list[i].a,list[i].b); } else{ b=find(list[i].a); a=rank[b]; if(a<=rank[list[i].a]){ ans[N++]=-1; } else{ ans[N++]=b; } } } for(i=N-1;i>=0;i--){ printf("%d\n",ans[i]); } } return 0; }
相关文章推荐
- ZOJ-3261(Connections in Galaxy War)——并查集
- ZOJ 3261 - Connections in Galaxy War ,并查集删边
- ZOJ 3261 Connections in Galaxy War 并查集
- ZOJ 3261 Connections in Galaxy War 并查集
- Zoj 3261 Connections in Galaxy War (逆向并查集)
- ZOJ 3261 Connections in Galaxy War (并查集)
- ZOJ-3261-Connections in Galaxy War [逆向并查集]
- ZOJ 3261 Connections in Galaxy War(逆向并查集)
- ZOJ Problem Set - 3261 Connections in Galaxy War(并查集)
- zoj 3261 - Connections in Galaxy War(并查集)
- ZOJ 3261 Connections in GalaxyWar(并查集:离线处理)
- ZOJ 3261 Connections in Galaxy War (并查集)
- ZOJ ~ 3261 ~ Connections in Galaxy War (逆序并查集 + map)
- Zoj 3261 Connections in Galaxy War【逆序并查集】
- ZOJ 3261 Connections in Galaxy War(逆向并查集)
- ZOJ 3261 Connections in Galaxy War 反向用并查集
- zoj 3261 Connections in Galaxy War 删边并查集模板
- ZOJ 3261 Connections in Galaxy War【并查集】
- ZOJ 3261 Connections in Galaxy War (离线处理+逆向并查集)
- ZOJ-3261 Connections in Galaxy War 并查集 离线操作