[kuangbin带你飞]专题五 并查集 I POJ 1984
2016-10-18 16:54
363 查看
题目地址:https://vjudge.net/contest/66964#problem/I
思路:带权并查集,感觉并查集都是套路啊……基本和前面的代码没什么差别都……
AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=40000+10;
int fa[maxn];
struct pos {
int u,v,x,y,t;
}E[maxn];
struct point{
int x,y;
}sum[maxn];
int find(int p)
{
if(p==fa[p])
return fa[p];
int old=fa[p];
fa[p]=find(fa[p]);
sum[p].x+=sum[old].x;
sum[p].y+=sum[old].y;
return fa[p];
}
bool cmp(pos a,pos b)
{
return a.t<b.t;
}
bool cmp1(pos a,pos b)
{
return a.x<b.x;
}
pos qq[10000+10];
int n,m;
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=0;i<=n;i++)
{
fa[i]=i;
sum[i].x=sum[i].y=0;
}
for(int i=1;i<=m;i++)
{
char op[10];
int temp;
scanf("%d%d%d%s",&E[i].u,&E[i].v,&temp,op);
if(op[0]=='E')
E[i].x=temp,E[i].y=0;
else if(op[0]=='W')
E[i].x=-temp,E[i].y=0;
else if(op[0]=='S')
E[i].x=0,E[i].y=temp;
else if(op[0]=='N')
E[i].x=0,E[i].y=-temp;
}
int k;
scanf("%d",&k);
for(int i=1;i<=k;i++)
{
scanf("%d%d%d",&qq[i].u,&qq[i].v,&qq[i].t);
qq[i].x=i;
}
sort(qq+1,qq+1+k,cmp);
int now=1;
for(int i=1;i<=qq[k].t;i++)
{
if(i<=m)
{
int p=E[i].u;
int q=E[i].v;
int fp=find(p);
int fq=find(q);
if(fp!=fq)
fa[fp]=fq;
sum[fp].x=sum[q].x+E[i].x-sum[p].x;
sum[fp].y=sum[q].y+E[i].y-sum[p].y;
}
//printf("%d %d\n",i,now);
int j=now;
for(j=now;qq[j].t<=i && j<=k;j++)
{
int p=qq[j].u;
int q=qq[j].v;
int fp=find(qq[j].u);
int fq=find(qq[j].v);
if(fp!=fq)
qq[j].y=-1;
else
qq[j].y=abs(sum[p].x-sum[q].x)+abs(sum[p].y-sum[q].y);
// printf("%d %d %d\n",fp,fq,qq[j].y);
}
now=j;
}
sort(qq+1,qq+1+k,cmp1);
for(int i=1;i<=k;i++)
printf("%d\n",qq[i].y);
}
}
思路:带权并查集,感觉并查集都是套路啊……基本和前面的代码没什么差别都……
AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=40000+10;
int fa[maxn];
struct pos {
int u,v,x,y,t;
}E[maxn];
struct point{
int x,y;
}sum[maxn];
int find(int p)
{
if(p==fa[p])
return fa[p];
int old=fa[p];
fa[p]=find(fa[p]);
sum[p].x+=sum[old].x;
sum[p].y+=sum[old].y;
return fa[p];
}
bool cmp(pos a,pos b)
{
return a.t<b.t;
}
bool cmp1(pos a,pos b)
{
return a.x<b.x;
}
pos qq[10000+10];
int n,m;
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=0;i<=n;i++)
{
fa[i]=i;
sum[i].x=sum[i].y=0;
}
for(int i=1;i<=m;i++)
{
char op[10];
int temp;
scanf("%d%d%d%s",&E[i].u,&E[i].v,&temp,op);
if(op[0]=='E')
E[i].x=temp,E[i].y=0;
else if(op[0]=='W')
E[i].x=-temp,E[i].y=0;
else if(op[0]=='S')
E[i].x=0,E[i].y=temp;
else if(op[0]=='N')
E[i].x=0,E[i].y=-temp;
}
int k;
scanf("%d",&k);
for(int i=1;i<=k;i++)
{
scanf("%d%d%d",&qq[i].u,&qq[i].v,&qq[i].t);
qq[i].x=i;
}
sort(qq+1,qq+1+k,cmp);
int now=1;
for(int i=1;i<=qq[k].t;i++)
{
if(i<=m)
{
int p=E[i].u;
int q=E[i].v;
int fp=find(p);
int fq=find(q);
if(fp!=fq)
fa[fp]=fq;
sum[fp].x=sum[q].x+E[i].x-sum[p].x;
sum[fp].y=sum[q].y+E[i].y-sum[p].y;
}
//printf("%d %d\n",i,now);
int j=now;
for(j=now;qq[j].t<=i && j<=k;j++)
{
int p=qq[j].u;
int q=qq[j].v;
int fp=find(qq[j].u);
int fq=find(qq[j].v);
if(fp!=fq)
qq[j].y=-1;
else
qq[j].y=abs(sum[p].x-sum[q].x)+abs(sum[p].y-sum[q].y);
// printf("%d %d %d\n",fp,fq,qq[j].y);
}
now=j;
}
sort(qq+1,qq+1+k,cmp1);
for(int i=1;i<=k;i++)
printf("%d\n",qq[i].y);
}
}
相关文章推荐
- [kuangbin带你飞]专题五 并查集 B POJ 1611
- [kuangbin带你飞]专题五 并查集 J POJ 2492
- [kuangbin带你飞]专题五 并查集 F POJ 1417
- [kuangbin带你飞]专题五 并查集 N POJ 1308
- [kuangbin带你飞]专题五 并查集 A - Wireless Network
- [kuangbin带你飞]专题五 并查集 G POJ 1456
- hdu 1272 小希的迷宫[kuangbin带你飞]专题五 并查集
- [kuangbin带你飞]专题五 并查集 D HDU 3038
- [kuangbin带你飞]专题五 并查集 H POJ 1733
- [kuangbin带你飞]专题六 最小生成树 I POJ 1258
- POJ 2236 A - Wireless Network[kuangbin带你飞]专题五 并查集
- [kuangbin带你飞]专题五 并查集
- 【 题集 】 【kuangbin带你飞】专题五 并查集 更新ing...
- [kuangbin带你飞]专题五 并查集 E POJ 1182
- [kuangbin带你飞]专题五 并查集 K POJ 2912
- [kuangbin带你飞]专题五 【并查集】 【--完结--】
- hdu 3038D - How Many Answers Are Wrong [kuangbin带你飞]专题五 并查集
- [kuangbin带你飞]专题五 并查集——题解
- [kuangbin带你飞]专题四 最短路练习 I POJ 2240
- [kuangbin带你飞]专题五 并查集 A POJ 2236