使用多线程在无向图中查找连通分量

问题描述

我有一个对象列表(无向边),如下所示:

pairs = [

 pair:["a2","a5"],pair:["a3","a6"],pair:["a4",pair:["a7","a9"]

];

我需要在不同的组中找到所有组件(连接的节点)。所以从给定的对我需要得到:

groups = [
  group1: ["a2","a5","a4"],group2: ["a3",group3: ["a7","a9"]
];

互联网上有很多解决方案,但他们使用的是1个标准线程,但我正在寻找使用两个(就足够了)或更多线程的代码。请帮助我,代码可以使用任何语言,但首选 Java。

这是我的单线程代码

import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.Random;

class CCGraph
{
    static final int MAXV      =50000;
    static final int MAXDEGREE = 5000;
    public int       edges[][] = new int[MAXV + 1][MAXDEGREE];
    public int       degree[]  = new int[MAXV + 1];
    public int       nvertices;
    public int       nedges;
    public long time2;
    public long time1;

    CCGraph()
    {
        nvertices = nedges = 0;
        for (int i = 1; i <= MAXV; i++)
            degree[i] = 0;
    }

    void read_CCGraph(boolean directed)
    {
        int x,y;
        Scanner sc = new Scanner(system.in);
        System.out.println("Enter the number of vertices: ");
        nvertices = sc.nextInt();
        System.out.println("Enter the number of edges: ");
        int m = sc.nextInt();
        System.out.println("manual input -  0,Randomize - 1");
        int entertype = sc.nextInt();
        if(entertype==1) {
             time1 = System.currentTimeMillis();
            for (int i = 1; i <= m; i++) {

                Random random = new Random();
                System.out.printf(String.valueOf(i) + ".  ");
                x = random.nextInt(nvertices) + 1;
                System.out.printf(String.valueOf(x) + " ");
                y = random.nextInt(nvertices) + 1;
                System.out.println(String.valueOf(y));

                insert_edge(x,y,directed);
            }
            time2 = System.currentTimeMillis()- time1;
        }
         if(entertype==0) {
            System.out.println("Enter the edges: <from> <to>");
        for (int i = 1; i <= m; i++) {

            System.out.printf(String.valueOf(i) + ".  ");
            x = sc.nextInt();

            y = sc.nextInt();


            insert_edge(x,directed);
        }
        }
        sc.close();
    }

    void insert_edge(int x,int y,boolean directed)
    {
        if (degree[x] > MAXDEGREE)
            System.out.printf(
                    "Warning: insertion (%d,%d) exceeds max degree\n",x,y);
        edges[x][degree[x]] = y;
        degree[x]++;
        if (!directed)
            insert_edge(y,true);
        else
            nedges++;
    }

    void print_CCGraph()
    {
        for (int i = 1; i <= nvertices; i++)
        {
            System.out.printf("%d: ",i);
            for (int j = degree[i] - 1; j >= 0; j--)
                System.out.printf(" %d",edges[i][j]);
            System.out.printf("\n");
        }
    }
}

class ConnectedComponents
{
    static final int MAXV         = 100000;
    static boolean   processed[]  = new boolean[MAXV];
    static boolean   discovered[] = new boolean[MAXV];
    static int       parent[]     = new int[MAXV];

    static void bfs(CCGraph g,int start)
    {
        Queue<Integer> q = new LinkedList<Integer>();
        int i,v;
        q.offer(start);
        discovered[start] = true;
        while (!q.isEmpty())
        {
            v = q.remove();
            process_vertex(v);
            processed[v] = true;
            for (i = g.degree[v] - 1; i >= 0; i--)
            {
                if (!discovered[g.edges[v][i]])
                {
                    q.offer(g.edges[v][i]);
                    discovered[g.edges[v][i]] = true;
                    parent[g.edges[v][i]] = v;
                }
            }
        }
    }

    static void initialize_search(CCGraph g)
    {
        for (int i = 1; i <= g.nvertices; i++)
        {
            processed[i] = discovered[i] = false;
            parent[i] = -1;
        }
    }

    static void process_vertex(int v)
    {
        System.out.printf(" %d",v);
    }

    static void connected_components(CCGraph g)
    {
        int c;
        initialize_search(g);
        c = 0;
        for (int i = 1; i <= g.nvertices; i++)
        {
            if (!discovered[i])
            {
                c++;
                System.out.printf("Component %d:",c);
                bfs(g,i);
                System.out.printf("\n");
            }
        }
    }

    static public void main(String[] args)
    {
        CCGraph g = new CCGraph();
        g.read_CCGraph(false);
        long m = System.currentTimeMillis();

        g.print_CCGraph();
        System.out.println((double) (System.currentTimeMillis() - m));
        connected_components(g);
        long m2 = System.currentTimeMillis()-m;
        System.out.println("Total time: "+(double) ((g.time2+m2)));
        }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)