Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.03.2016, 14:15   #1
fkty
Форумчанин
 
Регистрация: 22.05.2013
Сообщений: 245
По умолчанию Алгоритм Форда

Здравствуйте, помогите пожалуйста с задачей.
Дан граф. Каждой дуге приписано некоторое число (вес) cij.Найти все кратчайшие пути между любой парой вершин xi,xj, где длина пути есть суммарный вес дуг, образующих этот путь.
d(xi,xj) -расстояние между вершинами xi,xj.
Алгоритм работает так:
выбираем одну из вершин в качестве начальной i=1. И находим все кратчайшие расстояния от начальной вершины до всех остальных. Затем в качестве начальной берем следующую вершину i=2 и так же находим все кратчайшие расстояния до остальных вершин. И так далее до i=n.
d(x1,xj) = 0, если j=1 и w, если j!= 1
w>>sum(cij)
Если уже известны значения на итерации к, то расстояние на к+1 итерации = min {расстояние на к-той итерации+cij}
Повторяем эти шаги, пока две соседние итерации не дадут одинаковые значения.
Код:
#include <fstream>
#include <vector>
#include <algorithm>
#include <iomanip>

using namespace std;

vector< vector<int> > g, d;
const int INF=10;

int main ()
{
	ifstream fin ("input.txt");
	ofstream fout ("output.txt");
	int n,m,i,j,k;
	fin>>n>>m; // количество вершин и дуг

	vector<int> a(0);
	vector<int> b(n,INF);
	g.assign(n,a);
	d.assign(n,b);
	int count=0;
	for (i=0;i<n;i++)
	{
		fin>>k;
		while(k>=0)
		{
			g[i].push_back(k);
			j=k;
			fin>>k;
			d[i][j] = k;
			fin>>k;
			count++;
		}

	}

	//fout<<count<<endl;
	for (i=0;i<n;i++)
	{
		for (j=0;j<n;j++)
			fout<<setw(4)<<d[i][j];
		fout<<endl;
	}
	return 0;
}

Ответ вывести в виде таблицы. Здесь пока выводится только расстояние из одной дуги.
Еще нужно найти сам путь кратчайшей длины для любой пары xi, xj.

В файле input.txt вводим например:
13 15 (это n,m)
1 4 2 3 3 2 4 3 -1 (из вершины 0 можно попасть в вершину 1 по дуге с весом 4 и т.д; -1 конец строки)
2 1 -1
5 4 -1
4 1 -1
-1
6 3 3 2 -1
7 4 10 2 -1
8 2 9 3 -1
-1
-1
11 3 12 1 -1
-1
-1
fkty вне форума Ответить с цитированием
Старый 19.03.2016, 17:32   #2
fkty
Форумчанин
 
Регистрация: 22.05.2013
Сообщений: 245
По умолчанию

нашла вот такой вариант:
Код:
#include <vector>
#include <iostream>
 
using namespace std;
 
struct edge {
    int a, b, cost;
};
 
int n, m, v;
vector<edge> e;
const int INF = 1000000000;
 
void solve() {
    vector<int> d (n, INF);
    d[v] = 0;
    vector<int> p (n, -1);
    for (int i=0; i<n-1; ++i) {
        bool any = false;
        for (int j=0; j<m; ++j)
            if (d[e[j].a] < INF)
                if (d[e[j].b] > d[e[j].a] + e[j].cost) {
                    d[e[j].b] = d[e[j].a] + e[j].cost;
                    p[e[j].b] = e[j].a;
                    any = true;
                }
        if (!any)  break;
    }
 
    if (d[t] == INF)
        cout << "No path from " << v << " to " << t << ".";
    else {
        vector<int> path;
        for (int cur=t; cur!=-1; cur=p[cur])
            path.push_back (cur);
        reverse (path.begin(), path.end());
 
        cout << "Path from " << v << " to " << t << ": ";
        for (size_t i=0; i<path.size(); ++i)
            cout << path[i] << ' ';
    }
}
Здесь получается необходимо ввести с клавиатуры количество вершин n и ребер m, список ребер e, начальную вершину v и вершину конечную t?
В этом случае выводится только число (кратчайший путь от начальной вершины до конечной), а как сделать,чтобы сразу по всем вершинам выводилось в виде таблицы?
fkty вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
алгоритм форда-фалкерсона qpuTuJlb Общие вопросы Delphi 0 21.06.2013 19:58
алгоритм Форда-Беллмана [язык - C] dixonich Помощь студентам 0 13.05.2012 14:37
алгоритм Форда-Фалкерсона goldlider Общие вопросы Delphi 10 20.04.2010 17:41
Алгоритм Форда-Беллмана k1r1ch Помощь студентам 2 27.12.2009 20:10
алгоритм Форда-Беллмана Foky Паскаль, Turbo Pascal, PascalABC.NET 1 19.10.2008 17:27