1003 Emergency

java代码提交注意点
1. 类名改为Main
2. 不要有package
题目注意点
1. 考虑出发城市和目的城市相同!!!
总体思路
- 用迪杰斯特拉算法求出发城市到目的城市之间的最短距离(不需要走完全部的过程,一旦求出两者之间的最短距离就可以break)
- 使用递归遍历所有路径(条件:路径和必须<=min<出发,目的>,否则不递归),递归的出口是顶点为终点时候
java代码
import java.util.HashSet;
import java.util.Scanner;
public class A1003 {
int cityNum;
int[][] map; // 地图
int[] teamNum;
int startCity;
int endCity;
int value; //最短路径
int ways = 0; //最短路数
int maxTeam = 0; //最大团队数
A1003(int length, int startCity, int endCity) {
this.cityNum = length;
this.startCity = startCity;
this.endCity = endCity;
teamNum = new int[length];
map = new int[length][length];
for (int i = 0; i < length; i++) {
for (int j = 0; j < length; j++) {
map[i][j] = 0;
}
}
}
void getMinDistance() {
int startPoint = startCity;
int[] path = new int[cityNum];
int[] values = new int[cityNum];
int[] help = new int[cityNum];
for (int i = 0; i < cityNum; i++) {
values[i] = Integer.MAX_VALUE;
help[i] = 0;
}
path[startPoint] = startPoint;
help[startPoint] = 1;
values[startPoint] = 0;
while (true) {
for (int i = 0; i < cityNum; i++) {
if (map[startPoint][i] != 0) {
if (map[startPoint][i] + values[startPoint] < values[i]) {
values[i] = map[startPoint][i] + values[startPoint];
path[i] = startPoint;
}
}
}
int min = Integer.MAX_VALUE;
int index = -1;
for (int i = 0; i < cityNum; i++) {
if (help[i] != 1) {
if (values[i] < min) {
min = values[i];
index = i;
}
}
}
if (index == endCity) {
this.value = min;
break;
}
help[index] = 1;
startPoint = index;
}
}
void dfs(int index, int teams, int values, HashSet<Integer> set) {
if (index == this.endCity) {
if (teams > this.maxTeam) {
maxTeam = teams;
}
this.ways++;
return;
}
for (int i = 0; i < this.cityNum; i++) {
if (this.map[index][i] != 0 && !set.contains(i)) {
if (values + this.map[index][i] <= this.value) {
HashSet<Integer> set1 = (HashSet<Integer>) set.clone();
set1.add(i);
dfs(i, teams + this.teamNum[i], values + this.map[index][i], set1);
}
}
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int cityNum = in.nextInt();
int roadNum = in.nextInt();
A1003 a1003 = new A1003(cityNum, in.nextInt(), in.nextInt());
for(int i=0;i<cityNum;i++){
a1003.teamNum[i] = in.nextInt();
}
for(int i=0;i<roadNum;i++){
int row = in.nextInt();
int col = in.nextInt();
int value = in.nextInt();
a1003.map[row][col] = value;
a1003.map[col][row] = value;
}
if(a1003.startCity == a1003.endCity) {
System.out.println(1 + " " + a1003.teamNum[a1003.startCity]);
}else {
a1003.getMinDistance();
HashSet<Integer> set = new HashSet<Integer>();
set.add(a1003.startCity);
a1003.dfs(a1003.startCity, a1003.teamNum[a1003.startCity], 0, set);
System.out.println(a1003.ways + " " + a1003.maxTeam);
}
in.close();
}
}