Мне нужно использовать алгоритм поиска соединения, чтобы решить проблему коммивояжера. Я довольно много сделал это, за исключением одной проблемы, которую я только что обнаружил. Когда он обрабатывает каждое ребро, он проверяет цикл, который выполняется с целым родительским массивом. Проблема в том, что когда он добирается до последнего края, мне нужно добавить для завершения проблемы, так как это технически цикл, он не добавляет ребра, поэтому путь не может быть завершен. Как я могу отличить бесполезный цикл от цикла, указывающего на то, что мы закончили?Union Найти, чтобы решить Traveling Salesman
Вот код, который я получил до сих пор
private int[] parent; //parent of each vertex
private int[] connection; //number of edges coming from a given vertex
private int[] subsize; //size of each subtree
boolean donepath;
public void GreedyAlgo(){
ArrayList<Edge> newedges = new ArrayList<Edge>();
for(int i = 0; i<graph.realedge.size();i++){
if(donepath) break;
Edge e= graph.realedge.get(i);
int x = e.in1;
int y = e.in2;
if(unionFind(x,y) && !thirdEdge(x,y)){
newedges.add(e);
}
else{
}
}
}
public int findParent(int i){
if (parent[i] != i)
return findParent(parent[i]);
return parent[i];
}
public boolean unionFind(int x, int y){
int xx = findParent(x);
int yy = findParent(y);
if(xx == yy){
if(subsize[xx]== n){
donepath = true;
return true;
}
return false;
}
else{
if(subsize[xx] < subsize[yy]){
parent[xx] = yy;
subsize[yy]+=subsize[xx];
}
else if(subsize[xx] > subsize[yy]){
parent[yy] = xx; subsize[xx]+=subsize[yy];
}
else{
parent[yy] = xx;
subsize[xx]+=subsize[yy];
}
connection[x]++;
connection[y]++;
}
return true;
}
public boolean makesCycle(int x, int y){
int xx = findParent(x);
int yy = findParent(y);
if(xx == yy){
return true;
}
return false;
}
Вот ребра она проходит в порядке
0-0,
1-1,
2-2,
3-3,
4-4,
0-4 should get added,
2-3 should get added,
3-2,
4-0,
0-1 should get added,
0-2 ,
0-3,
1-0,
1-4,
2-0,
3-0,
4-1,
1-3 should get added,
3-1,
2-4 should get added......but doesnt,
3-4,
4-2,
4-3,
1-2,
2-1,
как насчет остановки нежелательных циклов? –
У вас уже есть обнаружение цикла, это все равно должно выполняться в разделе «Продолжить как нормальное». – Dukeling
не уверен, если это так просто. Возможно, это так, как я ее реализовал. Не могли бы вы привести мне пример того, как я это сделаю? –