您的位置:首页 > 其它

[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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: