如何解决使用深度优先搜索的社交用户
我需要这样做: 实施深度优先搜索算法来确定给定的一对个体是否具有社会联系。算法应该从第一个个体开始,然后搜索图,直到到达第二个个体或直到访问了该连接子图中的所有单元格。该程序应显示“未连接”(当用户没有社交连接时)或“已连接”(当个人有社交连接时,应显示一系列用户,以指示个人如何连接)。
社交联系的概念定义为由一系列朋友联系在一起的个人。例如,如果用户 1 是用户 2 的好友,用户 2 是用户 6 的好友,用户 6 是用户 11 的好友,用户 11 是用户 5 的好友,那么我们说用户 1 和用户 5 通过用户 1、用户 2、用户 6、用户 11、用户 5 的序列建立社交联系。
该实现从 users.txt 读取所有文本,并将唯一的用户整数对存储在名为 UserIndex 的 HashMap 中。这用于轻松地从名称到邻接矩阵中的索引。用户也存储在一个 ArrayList 中,以便人们可以轻松获取与索引关联的名称。读取文件 ConnectedUsers.txt 并将所有连接的用户添加为邻接矩阵中的边,在这种情况下,它只是一个二维布尔数组,其中如果两个索引之间存在边,则值设置为 true。>
ConnectedUsers.txt 的内容:
- user1,user2
- user3,user4
- user5,user6
- user7,user8
- user9,user10
- user11,user12
- user13,user14
- user15,user16
- user17,user18
- user19,user20
Users.txt 的内容:
- user1
- user2
- user3
- user4
- user5
- user6
- user7
- user8
- user9
- user10
- user11
- user12
- user13
- user14
- user15
- user16
- user17
- user18
- user19
- user20
到目前为止,我已经完成了以下操作,但我不知道如何检查具有社交关系的个人。
public class GraphNode {
public String name;
public int index;
public boolean isVisited = false;
public GraphNode(String name,int index) {
this.name = name;
this.index = index;
}
}
public class Graph {
private HashMap<String,Integer> UserIndex = new HashMap<String,Integer>();
private ArrayList<String> Users = new ArrayList<String>();
ArrayList<GraphNode> nodeList = new ArrayList<GraphNode>();
boolean[][] adjacencyMatrix;
public Graph()
{
loadUsers();
matrix = new boolean[UserIndex.size()][UserIndex.size()];
loadConnectedUsers();
Set<HashMap.Entry<String,Integer>> key = UserIndex.entrySet();
for(HashMap.Entry<String,Integer> tempKey: key) {
nodeList.add(new GraphNode(tempKey.getKey(),tempKey.getValue()));
}
dfs();
}
public static void main(String[] args) {
new Graph();
}
public ArrayList<GraphNode> getNeighbors(GraphNode node) {
ArrayList<GraphNode> neighbors = new ArrayList<GraphNode>();
int nodeIndex = node.index;
for (int i=0; i<adjacencyMatrix.length; i++) {
if(matrix[nodeIndex][i]) {
neighbors.add(nodeList.get(i));
}
}
return neighbours;
}
void dfsVisit(GraphNode node) {
Stack<GraphNode> stack = new Stack<>();
stack.push(node);
while(!stack.isEmpty()) {
GraphNode currentNode = stack.pop();
currentNode.isVisited = true;
System.out.print(currentNode.name + " ");
ArrayList<GraphNode> neighbors = getNeighbors(currentNode);
for (GraphNode neighbor : neighbors) {
if (!neighbor.isVisited) {
stack.push(neighbor);
neighbor.isVisited = true;
}
}
}
}
void dfs() {
for (GraphNode node : nodeList) {
if(!node.isVisited) {
dfsVisit(node);
}
}
}
public void loadConnectedUsers()
{
try
{
BufferedReader in = new BufferedReader(new FileReader(new File("ConnectedUsers.txt")));
while(in.ready())
{
String text = in.readLine();
StringTokenizer stringLine = new StringTokenizer(text,",");
String user1 = stringLine.nextToken();
String user2 = stringLine.nextToken();
addUndirectedEdge(UserIndex.get(user1),UserIndex.get(user2))
}
} catch (Exception e)
{
e.printstacktrace();
System.exit(1);
}
}
public void loadUsers()
{
try
{
BufferedReader in = new BufferedReader(new FileReader(new File("Users.txt")));
int count = 0;
while(in.ready())
{
String text = in.readLine();
UserIndex.put(text,count);
Users.add(text);
count++;
}
} catch (Exception e)
{
e.printstacktrace();
System.exit(1);
}
}
private void addUndirectedEdge(int k,int m) {
adjacencyMatrix[k][m] = true;
adjacencyMatrix[m][k] = true;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。