假设我有一些用户的联系人(比如手机中的联系人)。在联系人中,用户将拥有他们朋友的联系信息(如电话号码)。我们认为它不会超过1000.
如果在A的联系中,A有B的联系信息,我们说A和B是朋友(即使B没有A)。
现在,我们考虑User1和User2是否有两个以上的常见朋友User3和User4或更多,我们说User1和User2是可能的朋友(如果User1和User2不是朋友)。
我们有n个用户的联系人。如何找到所有这些用户的可能朋友。
谢谢!
答案 0 :(得分:0)
怎么样:获取UserA和UserB之间可能的路径数,然后如果数字> 2,则userA和userB可能是朋友。
首先,您需要创建图表的邻接矩阵(http://en.wikipedia.org/wiki/Adjacency_matrix)
类似的东西:
//Numbers of edges
int n = 5;
int[][] adjacencymatrix = new int[][] {
new int[] {1,1,1,0,0}, // 1
new int[] {1,1,1,1,0}, // / | \
new int[] {1,1,1,1,0}, // 0 | 3 - 4
new int[] {0,1,1,1,1}, // \ | /
new int[] {0,0,0,1,1}, // 2
};
然后,还有一些东西
// stock the path
int[] path = new int[n];
// lock for the search (all at false at the beginning)
boolean[] taboo = new boolean[n];
// start and stop edges
int source=0;
int target=4;
最后:
void explore(int position, int depth) {
path[depth]=position;
// arrived at stop point -> finished
if (position==target) {
// print the solution
for(int i=0;i<=depth;i++) System.out.print(path[i]+" ");
System.out.print("\n");
return;
}
taboo[position]=true; // remember you already went on this edge
// explore remaining paths
for(int i=0;i<n;i++) {
if (adjacencymatrix[position][i]==0 || taboo[i]) continue;
explore(i,depth+1);
}
taboo[position]=false;
}
它的基本功能是找到从UserA到UserB的所有唯一路径。 希望这会对你有所帮助!
答案 1 :(得分:0)
让G
为无向图,其中顶点集是联系人,而(a,b)是边{if} a
是b
的朋友(即a
}是b
列表中的联系人或其他方式)。
然后问题只是找到从a
到b
的两条不同路径。这些路径可以通过以下方式找到:
a
在搜索过程中访问b
时,请打印其路径。
当程序输出两个路径时停止。
问题是你可能找不到这样的路径,这一般会使问题变得困难。