如何从用户的联系人中找到“可能的朋友”

时间:2014-11-12 11:34:52

标签: algorithm graph graph-algorithm

假设我有一些用户的联系人(比如手机中的联系人)。在联系人中,用户将拥有他们朋友的联系信息(如电话号码)。我们认为它不会超过1000.

如果在A的联系中,A有B的联系信息,我们说A和B是朋友(即使B没有A)。

现在,我们考虑User1和User2是否有两个以上的常见朋友User3和User4或更多,我们说User1和User2是可能的朋友(如果User1和User2不是朋友)。

我们有n个用户的联系人。如何找到所有这些用户的可能朋友。

谢谢!

2 个答案:

答案 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} ab的朋友(即a }是b列表中的联系人或其他方式)。

然后问题只是找到从ab的两条不同路径。这些路径可以通过以下方式找到:

  1. a
  2. 开头运行DFS
  3. 在搜索过程中访问b时,请打印其路径。

  4. 当程序输出两个路径时​​停止。

  5. 问题是你可能找不到这样的路径,这一般会使问题变得困难。