UVA 1329 Corporative Network(并查集:路径压缩)
2014-03-09 00:19
337 查看
UVA 1329 Corporative Network(并查集:路径压缩)
题意:
初始时有n个点(编号1到n),每个点都没有父节点,然后依次执行下面两条命令:
I u v :把节点u的父亲设置为v,并且设u节点到v的距离为|u-v|%1000,输入保证执行I命令的时候,u没有父节点。
E u:查询u节点到根节点的距离。
输入:首先是T,表示实例个数。每个实例第一行是n(5<=n<=20000),接下有不超过200000行,每行一个指令,以单独的O字母行表示结束。
输出:对于每条E指令,输出查询结果。
分析:
本题连通分量的节点不仅要维护fa信息,还需要维护dist信息。
其中fa[i]表示i节点的直属父亲节点编号,dist[i]表示i节点到它直属父亲节点的距离。在每次findset(i)操作后,将i节点连接到当前连通分量的根节点下面,并且更新dist[i]的值。其实就是比普通的并查集操作多了一个相对距离的概念。
注意:每次查询u节点到根节点距离前,需要findset(u)操作,这样才能让u节点放在其所属连通分量的根节点下面。
AC代码(新):
AC代码:
new AC code:
题意:
初始时有n个点(编号1到n),每个点都没有父节点,然后依次执行下面两条命令:
I u v :把节点u的父亲设置为v,并且设u节点到v的距离为|u-v|%1000,输入保证执行I命令的时候,u没有父节点。
E u:查询u节点到根节点的距离。
输入:首先是T,表示实例个数。每个实例第一行是n(5<=n<=20000),接下有不超过200000行,每行一个指令,以单独的O字母行表示结束。
输出:对于每条E指令,输出查询结果。
分析:
本题连通分量的节点不仅要维护fa信息,还需要维护dist信息。
其中fa[i]表示i节点的直属父亲节点编号,dist[i]表示i节点到它直属父亲节点的距离。在每次findset(i)操作后,将i节点连接到当前连通分量的根节点下面,并且更新dist[i]的值。其实就是比普通的并查集操作多了一个相对距离的概念。
注意:每次查询u节点到根节点距离前,需要findset(u)操作,这样才能让u节点放在其所属连通分量的根节点下面。
AC代码(新):
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn=20000+5; //路径压缩并查集 int fa[maxn]; int dist[maxn]; int findset(int x) { if(fa[x]==-1) return x; int root = findset(fa[x]); dist[x] += dist[fa[x]]; return fa[x] = root; } int main() { int T; scanf("%d",&T); while(T--) { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { fa[i]=-1; dist[i]=0; } char str[100]; while(scanf("%s",str)==1 && str[0]!='O') { if(str[0]=='I') { int u,v; scanf("%d%d",&u,&v); fa[u]=v; dist[u]= abs(u-v)%1000; } else if(str[0]=='E') { int u; scanf("%d",&u); findset(u); printf("%d\n",dist[u]); } } } return 0; }
AC代码:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int MAXN=20000+100; int d[MAXN];//点到根节点的距离 int pa[MAXN];//父节点 int findset(int x)//查询x的根节点,并且使得d[x]变成x到根的距离 { if(x==pa[x])return x; int root = findset(pa[x]);//执行完这句,pa[X]到根的距离已经是d[pa[x]]了 d[x]=d[x]+d[pa[x]]; return pa[x]=root; } int main() { int T; scanf("%d",&T); while(T--) { int n; scanf("%d",&n); for(int i=0;i<=n;i++) { pa[i]=i; d[i]=0; } char op[20]; while(scanf("%s",op)) { if(op[0]=='O') break; else if(op[0]=='I') { int u,v; scanf("%d%d",&u,&v); pa[u]=v; d[u]=abs(u-v)%1000; } else if(op[0]=='E') { int u; scanf("%d",&u); findset(u); printf("%d\n",d[u]); } getchar();//读/n } } return 0; }
new AC code:
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; const int maxn=20000+5; //并查集操作 int fa[maxn]; int dist[maxn];//dist[i]==x表i到其父节点的距离为x int findset(int x) { if(fa[x]==-1) return x; int father=fa[x]; fa[x]=findset(fa[x]);//将x连接到连通分量根下面 dist[x]=dist[x]+dist[father];//更新x到新父亲的距离 return fa[x]; } int main() { int T; scanf("%d",&T); while(T--) { int n; scanf("%d",&n); memset(fa,-1,sizeof(fa)); memset(dist,0,sizeof(dist)); char cmd; int u,v; while(scanf(" %c",&cmd)==1) { if(cmd=='O') break; else if(cmd=='E') { scanf("%d",&u); findset(u);//这步不能少 printf("%d\n",dist[u]); } else if(cmd=='I') { scanf("%d%d",&u,&v); fa[u]=v; dist[u]=abs(u-v)%1000; } } } return 0; }
相关文章推荐
- Corporative Network UVA - 1329 加权并查集(压缩路径优化)
- uva1329 Corporative Network(并查集:路径压缩)
- UVAalive 3027 Corporative Network(并查集的路径压缩维护)
- 并查集 + 路径压缩(经典) UVALive 3027 Corporative Network
- uvalive 3027 Corporative Network 并查集+路径压缩
- uva1493 - Draw a Mess 并查集路径压缩
- 并查集 路径压缩
- LA 3027 Corporative Network 合作网络【并查集+路径压缩】
- 2002年NOI全国竞赛 银河英雄传说(并查集压缩路径的压缩路径)
- HDU 3047 Zjnu Stadium(带权并查集,路径压缩)
- C - Corporative Network UVA - 1329 -加权并查集
- 并查集 路径压缩
- 数据结构与算法分析(Java语言描述)(24)—— 并查集的路径压缩
- 数据结构 并查集 路径压缩
- 并查集,battles over cities,路径压缩,优化与封装,无向图连通性
- 并查集 ---压缩路径
- 并查集(路径压缩 && 启发式合并!!!)
- POJ 1182 食物链(并查集:路径压缩)
- POJ 1984 Navigation Nightmare(路径压缩并查集)
- 并查集 路径压缩