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 |
贴一发JAVAimport java.io.BufferedInputStream; import java.util.PriorityQueue; import java.util.Scanner; public class Main { static int[]root,valuex,valuey,ans; static int[] dir; static int [][] way; static String[] direction; static class ask implements Comparable<ask>{ int from,to,no; int line; public ask(int from,int to,int no,int line) { this.from=from;this.to=to;this.no=no;this.line=line; } @Override public int compareTo(ask o) { return this.no-o.no; } } static int find(int a) { int temp; if(root[a]!=a) { temp = root[a]; root[a]=find(root[a]); valuex[a]+=valuex[temp]; valuey[a]+=valuey[temp]; } return root[a]; } public static void main(String[] args) { Scanner sc = new Scanner(new BufferedInputStream(System.in)); way=new int[40010][3]; direction=new String[40010]; root=new int[40010]; valuex=new int[40010]; valuey=new int[40010]; ans = new int [40010]; int n=sc.nextInt(); int m=sc.nextInt(); PriorityQueue<ask>asks=new PriorityQueue<ask>(); for(int i=0;i<root.length;i++)root[i]=i; asks.clear(); for(int i=1;i<=m;i++) { //预先记录地图 way[i][0]=sc.nextInt(); way[i][1]=sc.nextInt(); way[i][2]=sc.nextInt(); direction[i]=sc.next(); } int k=sc.nextInt(); for(int i=0;i<k;i++) {///预先记录询问 asks.add(new ask(sc.nextInt(),sc.nextInt(),sc.nextInt(), i+1)); } int a,b,c,d; int step=1; int []see=new int[40010]; while(!asks.isEmpty()) { //开始模拟:边查询边建图 ask temp = asks.poll(); //对于每一个查询 while(step<=temp.no && see[step]==0) { see[step]=1; a=way[step][0]; b=way[step][1]; c=way[step][2]; int roota = find(a); int rootb=find(b); /// System.out.println(String.format("加入: %d %d", a,b)); // System.out.println(String.format("两者根是: %d %d", roota,rootb)); if(roota!=rootb) { root[rootb]=roota; if(direction[step].equals("N")) { valuex[rootb]= valuex[a]-valuex[b]; valuey[rootb]= valuey[a]-valuey[b]+c; }else if(direction[step].equals("E")) { valuex[rootb]= valuex[a]-valuex[b]+c; valuey[rootb]= valuey[a]-valuey[b]; }else if(direction[step].equals("S")) { valuex[rootb]= valuex[a]-valuex[b]; valuey[rootb]= valuey[a]-valuey[b]-c; }else if(direction[step].equals("W")) { valuex[rootb]= valuex[a]-valuex[b]-c; valuey[rootb]= valuey[a]-valuey[b]; } } step++; } // System.out.println(String.format("更新到了: %d ", step)); int ra=find(temp.from); int rb=find(temp.to); // System.out.println(String.format("查询的两个根是: %d %d", ra,rb)); if(ra!=rb) ans[temp.line]=-1; else { int res = Math.abs( (valuex[temp.from]-valuex[temp.to]) )+ Math.abs( (valuey[temp.from]-valuey[temp.to]) ); ans[temp.line]=res; } } for(int i=1;i<=k;i++) System.out.println(ans[i]); } } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator