全体员工玩分组游戏,前面五分钟大家分头找队友,并将每个人找到的队友信息汇报给主持人,如果A和B是队友,B和C是队友,那么A和C也是队友;接着主持人不断地随机抽取两个人,希望判断二者是否为队友。请设计一个计算机程序辅助主持人判断两个人是否为队友,说明程序的关键算法,不需要代码实现。
例如:<小明,小王>,<小军,小王>,<小丽,小李>是队友,那么小军和小明是队友,小军和小丽不是队友。
解: 本问题是图的算法问题。
要判断A和B是不是好朋友,该问题就归结为判断A到B是否有通路,利用图的深度优先遍历即可,即:从A出发进行深度优先遍历,如果有B则是好朋友;如果没有遍历到B则不是好朋友。
算法复杂度为O(n)。
package org.jyjiao;
import java.util.*;
import java.util.List;
class Vertex {
String data;
boolean isVisited;
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
public boolean isVisited() {
return isVisited;
}
public void setVisited(boolean isVisited) {
this.isVisited = isVisited;
}
}
class Edge {
String strFrom;
String strTo;
public Edge(String strFrom, String strTo) {
this.strFrom = strFrom;
this.strTo = strTo;
}
String getFrom() {
return this.strFrom;
}
String getTo() {
return this.strTo;
}
}
class Graph {
HashMap<String, List<String>> gMap = new HashMap<String, List<String>>();
HashMap<String, Boolean> isVisitMap = new HashMap<String, Boolean>();
public Graph() {
gMap = this.createGraph();
}
HashMap<String, List<String>> createGraph() {
isVisitMap.put("小明", false);
isVisitMap.put("小军", false);
isVisitMap.put("小王", false);
isVisitMap.put("小丽", false);
isVisitMap.put("小李", false);
List<String> list1 = new ArrayList<String>();
list1.add("小明");
list1.add("小军");
gMap.put("小王", list1);
List<String> list2 = new ArrayList<String>();
list2.add("小王");
gMap.put("小明", list2);
List<String> list3 = new ArrayList<String>();
list3.add("小王");
gMap.put("小军", list3);
List<String> list5 = new ArrayList<String>();
list5.add("小丽");
gMap.put("小李", list5);
List<String> list6 = new ArrayList<String>();
list6.add("小李");
gMap.put("小丽", list6);
return gMap;
}
Edge getFirstEdge(String vertex) {
List<String> list = gMap.get(vertex);
String firstTo = list.get(0);
return new Edge(vertex, firstTo);
}
Edge getNextEdge(Edge edge) {
String eFrom = edge.getFrom();
String eTo = edge.getTo();
List<String> list = gMap.get(eFrom);
int pos = list.indexOf(eTo) + 1;
if (pos < list.size()) {
eTo = list.get(pos);
return new Edge(eFrom, eTo);
}
return null;
}
public boolean isConnect(String vFrom, String vTo) {
isVisitMap.put(vFrom, new Boolean(true));
boolean ret=false;
for (Edge e = getFirstEdge(vFrom); e != null; e = getNextEdge(e)) {
String eTo = e.getTo();
if (eTo == vTo) {
ret = true;
break;
} else {
if (!(isVisitMap.get(eTo).booleanValue())){
isConnect(eTo, vTo);
}
}
}
return ret;
}
}
public class IsFriend {
public static void main(String[] args) {
Graph graph = new Graph();
boolean isFriend = graph.isConnect("小李", "小丽");
if (isFriend) {
System.out.println("they are friends");
} else {
System.out.println("they are not friends");
}
}
}