现在的位置: 首页 > 综合 > 正文

poj 1984

2014年02月20日 ⁄ 综合 ⁄ 共 1522字 ⁄ 字号 评论关闭

带权并查集

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int f[40010];
int s1[40010],s2[40010];  //s1为水平,s2为竖直
int ans[10010];
struct Road{
    int u,v,c;
    char dir;
}road[40010];
struct Query{
    int u,v,id;
    int num;
}query[10010];
void init(int n){
    for(int i=1;i<=n;i++){
        f[i]=i;
        s1[i]=s2[i]=0;
    }
}
bool cmp(Query a,Query b){
    return a.id<b.id;
}
int find(int u){
    if(f[u]!=u){
        int tem=f[u];
        f[u]=find(tem);
        s1[u]+=s1[tem];
        s2[u]+=s2[tem];
    }
    return f[u];
}
void Union(int i){
    int u=find(road[i].u);
    int v=find(road[i].v);
    if(u!=v){
        f[u]=v;
        if(road[i].dir=='E'){
            s1[u]=-s1[road[i].u]+road[i].c+s1[road[i].v];
            s2[u]=-s2[road[i].u]+s2[road[i].v];
        }
        else if(road[i].dir=='W'){
            s1[u]=-s1[road[i].u]-road[i].c+s1[road[i].v];
            s2[u]=-s2[road[i].u]+s2[road[i].v];
        }
        else if(road[i].dir=='N'){
            s1[u]=-s1[road[i].u]+s1[road[i].v];
            s2[u]=-s2[road[i].u]+road[i].c+s2[road[i].v];
        }
        else if(road[i].dir=='S'){
            s1[u]=-s1[road[i].u]+s1[road[i].v];
            s2[u]=-s2[road[i].u]-road[i].c+s2[road[i].v];
        }
    }
}
int main(){
    int n,m,i,j,k;
    int now,u,v;
    char dir;
    scanf("%d %d",&n,&m);
    init(n);
    for(i=1;i<=m;i++)
        scanf("%d %d %d %c",&road[i].u,&road[i].v,&road[i].c,&road[i].dir);
    scanf("%d",&k);
    for(i=1;i<=k;i++){
        scanf("%d %d %d",&query[i].u,&query[i].v,&query[i].id);
        query[i].num=i;
    }
    sort(query+1,query+1+k,cmp);
    now=1;
    for(i=1;i<=m;i++){
        Union(i);
        while(query[now].id==i && now<=k){
            u=find(query[now].u);
            v=find(query[now].v);
            if(u==v)
                ans[query[now].num]=abs(s1[query[now].u]-s1[query[now].v])+abs(s2[query[now].u]-s2[query[now].v]);
            else
                ans[query[now].num]=-1;
            now++;
        }
        if(now==k+1)
            break;
    }
    for(i=1;i<=k;i++)
        printf("%d\n",ans[i]);
    return 0;
}

抱歉!评论已关闭.