• poj1984 Navigation Nightmare


    题目链接:https://vjudge.net/problem/POJ-1984#author=1838641320

    简单题意:相比较原题,这个链接里写的很清楚......

    这个其实基本是裸的带权并查集,只是要多维护一个方向的权值而已。注意距离的相对性不要弄反了,最后如果询问的点不在同一个集合就输出-1,否则输出水平和竖直方向,距离绝对值的和

    #include<iostream>
    #include<algorithm>
    #define IOS std::ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    using namespace std;
    
    const int maxn=40000+10;
    struct st{int x,y,d;char ch;}r[maxn];
    int fa[maxn],vx[maxn],vy[maxn]; 
    int n,m,i,j,k,dx,dy;
    
    int find(int x){
    	if (fa[x]!=x){
    	  int p=fa[x];
    	  fa[x]=find(fa[x]);
    	  vx[x]+=vx[p]; vy[x]+=vy[p];
    	}
    	return fa[x];
    } 
    
    int main(){
    	IOS; cin>>n>>m;
    	for (i=1;i<=n;i++) fa[i]=i; j=1;
    	for (i=1;i<=m;i++) cin>>r[i].x>>r[i].y>>r[i].d>>r[i].ch;
    	cin>>k; 
    	for (i=1;i<=k;i++){
    	  int u,v,q; 
    	  cin>>u>>v>>q;
    	  while (j<=q){
    	  	if (r[j].ch=='N'||r[j].ch=='S')
    		{dy=(r[j].ch=='N')?-r[j].d:r[j].d; dx=0;}
    		else {dx=(r[j].ch=='E')?-r[j].d:r[j].d; dy=0;}
    		int fx=find(r[j].x); int fy=find(r[j].y);
    		fa[fx]=fy;
    		vx[fx]=vx[r[j].y]+dx-vx[r[j].x];
    		vy[fx]=vy[r[j].y]+dy-vy[r[j].x];
    		j++;
    	  }
    	  int fu=find(u); int fv=find(v);
    	  int ans=abs(vx[u]+vx[fu]-vx[v])+abs(vy[u]+vy[fu]-vy[v]);
    	  if (fu==fv) cout<<ans<<endl; else cout<<-1<<endl;  
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    SQL分类
    简单poi读取excel
    Linux命令(2)-rm删除文件
    Linux下使用yum安装MariaDB
    linux下vi命令
    等价类划分法设计测试用例
    Linux命令(1)-创建文件
    职场面试必知:如何回答为何离开上一家公司
    软件测试的原则
    JAVA数组去除重复数据
  • 原文地址:https://www.cnblogs.com/edmunds/p/13549607.html
Copyright © 2020-2023  润新知