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 |
java代码,wr了,但自测数据全对了,不知道错在哪里啊,谁有测试数据给个啊!import java.io.BufferedInputStream; import java.io.FileReader; import java.util.HashMap; import java.util.PriorityQueue; import java.util.Scanner; public class Main { static boolean oj = true; static Scanner sca = null;// Scanner 占用内存较多:消耗2390K! static Main a2908 = null; //若开1024*1024大小的byte存状态,耗1M内存,不用了,直接整数存状态 static int[] clear= {0x0,0xFFFFFFFE,0xFFFFFFFD,0xFFFFFFFB,0xFFFFFFF7,0xFFFFFFEF, 0xFFFFFFDF,0xFFFFFFBF,0xFFFFFF7F,0xFFFFFEFF,0xFFFFFDFF, 0xFFFFFBFF,0xFFFFF7FF,0xFFFFEFFF,0xFFFFDFFF,0xFFFFBFFF, 0xFFFF7FFF,0xFFFEFFFF,0xFFFDFFFF,0xFFFBFFFF,0xFFF7FFFF}; //清零整数某一位要用 class Node implements Comparable<Node> { int key; long cost; public Node(int v, long cos) { key = v; cost = cos; } public int compareTo(Node o) { if(cost > o.cost) return 1; else if(cost < o.cost) return -1; return 0; } public boolean equals(Object obj) { if(obj instanceof Node) { return (key==((Node)obj).key && cost==((Node)obj).cost); } return false; } } public static void run() { try { sca = oj ? new Scanner(new BufferedInputStream(System.in)) : new Scanner(new FileReader("input2908.txt")); int inputcase = sca.nextInt(); a2908 = new Main(); for (int i = 0; i < inputcase; i++) { int len = sca.nextInt(); int quantumNum = sca.nextInt(); int problem = sca.nextInt(); char[][] ch = new char[quantumNum][len]; int[] cost = new int[quantumNum]; for (int j = 0; j < quantumNum; j++) { ch[j] = sca.next().toCharArray(); cost[j] = sca.nextInt(); } int[][]prob = new int[problem][2]; for (int j = 0; j < problem; j++) { prob[j][0] = Integer.parseInt(sca.next(),2); prob[j][1] = Integer.parseInt(sca.next(),2); } solve(ch, cost, prob); } //clossAll(); } catch (Exception e) { e.printStackTrace(); } } static void solve(char[][] quantum, int[] cost,int[][]prob) { for (int ip = 0; ip < prob.length; ip++) { int start = prob[ip][0]; int end = prob[ip][1]; //下面建立最小堆优先队列,bfs PriorityQueue<Node> pq = new PriorityQueue<Node>(128); //存状态,cost HashMap<Integer, Long> map = new HashMap<Integer, Long>(); bfs(start, end, quantum, cost, pq, map); }//for ip System.out.println(); }//solve private static void bfs(int start,int endc,char[][] quantum, int[] cost, PriorityQueue<Node> pq, HashMap<Integer, Long> map){ if(start == endc){ System.out.print("0 "); return; } Node root = a2908.new Node(start,Long.valueOf(0)); pq.add(root); boolean bfind = false; long necost = 0; int len = quantum[0].length; while (!(pq.isEmpty()||bfind)) { Node now = pq.poll(); //宽度bfs搜索,使用了最小堆优先队列,搜出的就是最短路 for (int i = 0; i < quantum.length; i++) { int ne = doByte(len, now.key, quantum[i]); necost = now.cost + cost[i]; if(ne == endc){ bfind = true; break; } Long getCost = map.get(ne); if (getCost == null || getCost > necost){ map.put(ne, necost); Node next = a2908.new Node(ne, necost); pq.add(next); } } }//while if(!bfind){ System.out.print("NP "); } else { System.out.print(necost + " "); } return; }//bfs //根据操作序列计算操作结果,用整数保存状态,所以用位运算 private static int doByte(int len,int src, char[]quant){ int f = src; int t = 0; for(int i = 0; i < quant.length; i++){ char q = quant[i]; switch(q) { case 'N': break; case 'F': t = 1 << (len-i-1); //取反 f = f^t; break; case 'C': f = f&clear[len-i]; //清零 break; case 'S': t = 1 << (len-i-1); f = f|t; //置1 break; default: break; } } return f; } /** * @param args */ public static void main(String[] args) { run(); } }//AcmPKU2908 Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator