找出图是否是同构Java
我需要通过生成所有置换来检查图是否同构。我正在使用这个置换类,现在我需要创建一个图形类,它将图形表示为2D布尔数组。例如,用户以字符串形式输入两个图形找出图是否是同构Java,java,Java,我需要通过生成所有置换来检查图是否同构。我正在使用这个置换类,现在我需要创建一个图形类,它将图形表示为2D布尔数组。例如,用户以字符串形式输入两个图形 例如“0-10-21-21-31-32-3”和“1-32-0-3 1-21-0” 现在,在我的构造函数中,我必须将其分解,并将其放入二维布尔数组中。我该怎么做呢 用户还可以输入更复杂的内容,如“0-11-2-2-3-0-4 0-11 1-5 1-6 2-7 2-8 3-9 3-10 4-5 6-7 8 8-9 10-11 4-7-8 5-9 5-
例如“0-10-21-21-31-32-3”和“1-32-0-3 1-21-0”
现在,在我的构造函数中,我必须将其分解,并将其放入二维布尔数组中。我该怎么做呢
用户还可以输入更复杂的内容,如“0-11-2-2-3-0-4 0-11 1-5 1-6 2-7 2-8 3-9 3-10 4-5 6-7 8 8-9 10-11 4-7-8 5-9 5-10 6-9 6-6-10 7-10 7-11”和“0-11-2-3-0-4 0-7 1-4 1-5 2-6 3-6 3-7 4-8 4-9 5-9 5-10 6-10 6-10 6-11 7-8-8-11 7-10-9-8-11”
公共类置换生成器
{
//私有数据
私有int[]perm;
私有布尔优先;
//建造师
公共置换生成器(int n)
{
perm=新整数[n];
第一个=正确;
}
公共int[]下一个()
{
int n=平均长度;
//开始置换:0 1 2 3…n-1
如果(第一)
{
第一个=假;
对于(int i=0;i=0&&perm[k]>=perm[k+1];k--)
;
if(k<0)
返回null;//不再返回
//求最大的l,使perm[k]=0&&perm[k]>=perm[l];l--)
;
//交换perm[k]和perm[l]
交换(perm、k、l);
//反向烫发[k+1]…烫发[n-1]
对于(i=k+1,j=n-1;i
您必须创建一个矩阵来表示图形,如下图所示:
您可以首先提示用户输入两个已连接的节点,例如1和2。那你会做的
matrix[1][2] = true;
matrix[1][2] = true;
matrix[2][1] = true;
如果考虑方向,这意味着1-2
与2-1
不同。否则(一个无方向的图),你会这样做
matrix[1][2] = true;
matrix[1][2] = true;
matrix[2][1] = true;
不要忘记使用false
初始化矩阵,这意味着(顶点未连接)。每次要检查顶点X
和Y
是否直接连接时,只需访问矩阵的位置(X,Y)
,并检查其是否为真
如果您的图是加权图,则需要有一个额外的矩阵来保存权重。另一种解决方案是只包含一个整数矩阵,其中-1
表示未连接,N>0
,表示给定的X
和Y
与权重N
连接
关于用户输入:
“0-11-2-3-0-40-11-51-62-72-83-93-104-56-78-910-114-74-84-85-95-106-96-107-11”
除其他外,您可以使用该类:
之后,您必须解析您的输入;让我们假设一个固定的格式来保存图形顶点,例如:
String input = "0-1 0-2 1-2 1-3 2-3";
int x,y;
for(int i = 0; i < input.length(); i+=4)
{
x = Character.getNumericValue(input.charAt(i)); // first vertex
y = Character.getNumericValue(input.charAt(i+2)); // second vertice
matrix_graph[x][y] = true;
matrix_graph[y][x] = true; // if the graph is not oriented.
}
String input=“0-10-21-21-31-32-3”;
int x,y;
对于(int i=0;i