Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Existence of a Graph  (Прочитано 7706 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Mayor
Специалист

ru
Offline Offline

« : 23-09-2007 13:33 » 

если в двух словах то нужно проверить, что матрица правильно задает минимальный путь между вершинами ...
Код:
ACM ICPC 2006­2007, NEERC, Moscow Subregional Contest
Moscow, October 21, 2006
Problem E. Existence of a Graph
Time limit:
1 second
Memory limit:
64 MiB
Let G be a weighted undirected graph with N vertices and M edges. The edge weights are positive integers.
The length of a path P in G is defined to be the sum of weights of edges on P. The length of a shortest path
in G from vi to v j is called the distance from vi to v j and is denoted by di j (for i, j = 1, 2, . . . , N). If no such
path exist, we put di j = -1
The distance matrix of a graph with N nodes is an N Ч N matrix M containing the values di j. In case di j =
the correspoding element of M is set to -1. For example, the distance matrix for the graph depicted in
Figure 1 is
0 1 2 -1
1 0 1 -1
2 1 0 -1
-1 -1 -1
0
You are given a square matrix D with integer elements. Write a program to determine if D is the distance
matrix of some graph.
Input
The input has the structure as follows. The first line contains an integer N (1 N 200). The next N lines
describe a matrix D. Each line contains N integers from range [-1, 1 000] separated by spaces.
Output
If the given matrix is a distance matrix of a certain undirected graph, print YES, otherwise print NO.
Example
stdin
stdout
4
YES
0 1 2 -1
1 0 1 -1
2 1 0 -1
-1 -1 -1 0
3
NO
0 1 3
1 0 1
3 1 0

верна ли гипотеза, что матрица минимальных расстояний между вершинами неориетированого графа верна тогда и только тогда, когда для любых вершин а и б, не существует такой вершины с, что путь а с б будет короче чем а б Не понял
в смысле как можно ее доказать теоретически?

я исползовал для решения грубый алгоритм с кубическим временем выполнения:
Код:
//#include <stdio.h>
#include <gtk/gtk.h>


int main () {
int d,i,ii,iii;
int a,b,c;
scanf("%d",&d);
int **matrix;
//matrix = (int**) new int [d][d];
matrix = g_new( int *,d);
for ( i=0;i<d;i++)
{
matrix[i] = g_new( int,d);
for (ii=0;ii<d;ii++)
{
scanf("%d",&matrix[i][ii]) ;
}
}

for ( i=0;i<d;i++)
{
a=matrix[i][i];
if ( a ) {
g_print(" found wrong edge at %d - %d  (%d) \n",i,i,a);
return 1;
}
for (ii=0;ii<d;ii++)
{
a=matrix[i][ii];
b=matrix[ii][i];
if (a !=b ) {
g_print(" found directed edge at %d - %d \n (%d != %d \n",i,ii,a,b);
return 1;
}
for (iii=0;iii<d;iii++)
{

b=matrix[i][iii];
c=matrix[iii][ii];
// g_print("%d\t%d\t%d\n ",a,b,c);
if ((a>b+c) &&( b>0) &&( c>0) ) {
g_print(" wrong edges at %d - %d, over %d \n (%d > %d + %d)\n",i,ii,iii,a,b,c);
       return 1;
}
}
}
}
g_print("YES\n");
return 0;
}

 существуют ли более оптимизированые алгоритмы для поиска ошибок в матрице?

Записан

1n c0de we trust
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 23-09-2007 14:45 » 

Такие задачи обычно решаются при помощи динамического программирования. Не факт, что оптимальное решение этой задачи требует динамического программирования, но судя по постановке, скорее всего это так.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Mayor
Специалист

ru
Offline Offline

« Ответ #2 : 24-09-2007 05:36 » new

Такие задачи обычно решаются при помощи динамического программирования. Не факт, что оптимальное решение этой задачи требует динамического программирования, но судя по постановке, скорее всего это так.

не знаю в этом плане не хватает теоретических знаний, меня хватило только на жадный алгоритм ...

в принципе если бы матрица графа была достаточна разряжена, то динамический подход, мог бы дать нижнюю асимптоту меньше О**3 от числа вершин, если не ошибаюсь что то типа волнового алгоритма поиска пути, но в этом графе по идее все пути уже найдены ...

после разработки жадного алгоритма, но до его реализации, я пробовал преобразовать матрицу в список путем удаления отсутвующих ребер ( == -1 ), но увяз в расчетах верхней асимптоты, даже не дойдя до средней  ...

есть где примеры динамического программирования?

если не ошибаюсь оно относится к разделу математики посвященному, линейному программированию?
Записан

1n c0de we trust
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines