| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Re:ac代码In Reply To:【很好并查集中档题】 很有收获,贴代码 Posted by:WilliamACM at 2013-03-10 23:42:18 #include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N=40005;
int fa[N];
struct node
{
int s,t,l;
int x,y;
}a[N],b[N];
int n,m;
bool cmp1(node a,node b)
{
return a.l<b.l;
}
int fx[N];
int fy[N];
int FA(int x)
{
if(x==fa[x]) return x;
int ans=FA(fa[x]);
if(fa[x]!=ans)
{
fx[x]+=fx[fa[x]];
fy[x]+=fy[fa[x]];
}
return fa[x]=ans;
}
int query(int s,int t)
{
if(FA(s)!=FA(t)) return -1;
// cout<<FA(s)<<endl;
// printf("%d : %d %d \n",s,fx[s],fy[s]);
// printf("%d : %d %d \n",t,fx[t],fy[t]);
return abs(fx[s]-fx[t])+abs(fy[s]-fy[t]);
}
void Union(node a)
{
int f1=FA(a.s);
int f2=FA(a.t);
if(f1==f2) return;
fa[f1]=f2;
fx[f1]=a.x-fx[a.s]+fx[a.t];
fy[f1]=a.y-fy[a.s]+fy[a.t];
query(a.s,a.t);
}
bool cmp2(node a,node b)
{
return a.x<b.x;
}
void init()
{
cin>>n>>m;
for(int i=0;i<m;i++)
{
int l;
char ss[9];
scanf("%d%d%d%s",&a[i].s,&a[i].t,&l,ss);
switch(ss[0])
{
case 'E':a[i].y=l;break;
case 'W':a[i].y=-l;break;
case 'N':a[i].x=l;break;
case 'S':a[i].x=-l;break;
}
}
int q;
scanf("%d",&q);
for(int i=0;i<q;i++)
{
scanf("%d%d%d",&b[i].s,&b[i].t,&b[i].l);
b[i].x=i;
}
sort(b,b+q,cmp1);
int cnt=0;
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=0;i<q;i++)
{
while(cnt<b[i].l)
{
Union(a[cnt++]);
}
b[i].y=query(b[i].s,b[i].t);
}
sort(b,b+q,cmp2);
for(int i=0;i<q;i++)
printf("%d\n",b[i].y);
}
int main()
{
// freopen("in.txt","r",stdin);
init();
// cout << "Hello world!" << endl;
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator