#java #ruby-on-rails #data-structures
#java #ruby-on-rails #структуры данных
Вопрос:
Как мне найти кратчайший невзвешенный путь, который имеет наименьший взвешенный path…eg если у меня есть два невзвешенных пути A-> B-> C = 2 и A-> D-> F = 2 …. как мне напечатать путь с меньшим весом?
Код для невзвешенного и взвешенного пути выглядит следующим образом:
public void unweighted( String startName )
{
clearAll( );
Vertex start = vertexMap.get( startName );
if( start == null )
throw new NoSuchElementException( "Start vertex not found" );
Queue<Vertex> q = new LinkedList<Vertex>( );
q.add( start ); start.dist = 0;
while( !q.isEmpty( ) )
{
Vertex v = q.remove( );
for( Edge e : v.adj )
{
Vertex w = e.dest;
if( w.dist == INFINITY )
{
w.dist = v.dist 1;
w.prev = v;
q.add( w );
}
}
}
}
взвешенный:
public void dijkstra( String startName )
{
PriorityQueue<Path> pq = new PriorityQueue<Path>( );
Vertex start = vertexMap.get( startName );
if( start == null )
throw new NoSuchElementException( "Start vertex not found" );
clearAll( );
pq.add( new Path( start, 0 ) ); start.dist = 0;
int nodesSeen = 0;
while( !pq.isEmpty( ) amp;amp; nodesSeen < vertexMap.size( ) )
{
Path vrec = pq.remove( );
Vertex v = vrec.dest;
if( v.scratch != 0 ) // already processed v
continue;
v.scratch = 1;
nodesSeen ;
for( Edge e : v.adj )
{
Vertex w = e.dest;
double cvw = e.cost;
if( cvw < 0 )
throw new GraphException( "Graph has negative edges" );
if( w.dist > v.dist cvw )
{
w.dist = v.dist cvw;
w.prev = v;
pq.add( new Path( w, w.dist ) );
}
}
}
}
Итак, я хочу напечатать невзвешенный путь с менее взвешенным путем, пожалуйста, помогите.
Комментарии:
1. Да? Что означает кратчайший невзвешенный путь, который имеет кратчайший взвешенный путь?
2. Невзвешенный путь — это то же самое, что и взвешенный путь, где все веса одинаковы. например 1. Если какая-либо часть пути взвешена, это означает, что веса больше не совпадают.
Ответ №1:
Хорошо, я собираюсь приблизиться к этому… Просмотрите свой список невзвешенных путей. Для каждого из них перейдите по структуре пути, суммируя все веса. Выберите тот, у которого наименьшее значение. Ваш код будет выглядеть примерно так, используя типичный шаблон поиска максимума / минимума:
int minimum = 99999; // use a value obviously larger than all paths
PathClass minPath = null;
for (PathClass path : unweightedPaths) {
int total = 0;
for (PathItemClass item : path) {
total = item.weight;
}
if (total < minimum) {
minimum = total;
minPath = path;
}
}
// do something with path, which is the smallest weighted path
Пожалуйста, дайте мне знать, нахожусь ли я вообще на правильном пути??