这道题的确是可以用简单BFS/DFS可以解决,主要是设计思路很重要,我觉得要点是分店要放一起BFS,谁先遍历到最近的客户,就是哪家店最近,完了vis=1这样就表示这个客户已经被最近的分店送到了。还有优化方面,如果确定所有的客户已经遍历到了,就要及时return,不然会超时严重。
这个 如果是换成C++语言 应该是可以拿到100满分的
没办法 这个JAVA确实跑的慢点
allPoint是做了一个优化,使得所有的客户被访问到后就不再继续遍历。
package csp2014_09_4;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
class Node{
int r,l,s;
Node(int a,int b,int c){
r=a;l=b;s=c;
}
public Node() {}
}
public class Main{
static int n,m,k,d;
static int vis[][];
static int needs[][];
static int spend[];
static Queue<Node> q ;
static int dir[][] = {
{-1,0},{1,0},{0,-1},{0,1}};
static long ans = 0;
static int allPoint = 0;
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
k = sc.nextInt();
d = sc.nextInt();
q = new LinkedList<Node>();
vis = new int[n+1][n+1];
needs = new int[n+1][n+1];
for (int i = 0; i < m; i++) {
int r = sc.nextInt();
int l = sc.nextInt();
q.add(new Node(r,l,0));
vis[r][l] = 1;
}
for (int i = 0; i < k; i++) {
int r = sc.nextInt();
int l = sc.nextInt();
int c = sc.nextInt();
if(needs[r][l]==0) allPoint++;
needs[r][l] +=