0819--找队友

全体员工玩分组游戏,前面五分钟大家分头找队友,并将每个人找到的队友信息汇报给主持人,如果AB是队友,BC是队友,那么AC也是队友;接着主持人不断地随机抽取两个人,希望判断二者是否为队友。请设计一个计算机程序辅助主持人判断两个人是否为队友,说明程序的关键算法,不需要代码实现。

 

 例如:<小明,小王><小军,小王><小丽,小李>是队友,那么小军和小明是队友,小军和小丽不是队友。  

 

解: 本问题是图的算法问题。

     要判断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");
		}

	}

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值