Матрица смежности неориентированного графа

ванмомас намбаван
Дата: 08.03.2015 14:37:14
Простой неоринтированный граф задан списком ребер.Выедите его представление в виде матрицы смежности.На вход дают Число Н-кол-во вершин графа и М- кол-во ребер,далее следует М строк по 2 числа в каждой-список ребер графа.Надо вывести матрицу смежности.
Организовал я это на си++ таким образом,считываю ребра в дувмерный массив ,потом присваеваю элемент двумерного массива единице с номером ребра которое дано было на ввод и вывожу матрицу смежности,собственно вот сам код:
#include <iostream>
#include <stdio.h>


using namespace std;

int main()
{
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
	bool a[100][100]={0};
	int  v[100][100];
	int i, j, n,m, count = 0;
	cin >> n>>m;
	int k = 0;
	for (int i = 0; i<m; ++i)
	{
		for (int j = 0; j<2; ++j)
		{
			cin >> v[i][j];
			if (j==1)
			{
			int aa=v[i][j]-1,aa1=v[i][j-1]-1;
            a[aa1][aa]=1;
			a[aa][aa1]=1;
			}
		}
		
	}
	for (int i = 0; i<n; ++i)
	{
		for (int j = 0; j<n; ++j)
		{
			
			cout<<a[i][j]<<" ";
		}
		cout<<endl;
	}

	return 0;
}

Хотел бы у вас узнать что в нем не так ибо в системе проверки заходит лишь на пол балла ,на 50 из 100.
SashaMercury
Дата: 10.03.2015 02:28:11
ванмомас намбаван,

зачем вы объявляется i,j в самом начале ?
int i, j, n,m, count = 0;


Почему массив неориентированного графа 100x100? (вы используете в 50 раз меньше) И почему вы не прокомментировали где и что ? Я вам уже давно писал, вы просите помощи у С/С++ программистов, а не у дворников. Потрудитесь уважать тех, кто читает ваш код(хотя и дворников нужно уважать).

ваше условие в двойном цикле не нужно(см. ниже рефакторинг)
if (j==1)


не уверен что у вас корректная работа с n,m.
также, вы не вызвали fclose()

рефакторинг в самом первом приближении

#include <iostream>
#include <stdio.h>


using namespace std;

int main()
{
	freopen("input.txt", "r", stdin);
	freopen("output.txt", "w", stdout);
	bool a[100][100] = { 0 };//матрица смежности
	int  v[100][2];//неориентированный граф
	int n, m, count = 0;
	cin >> n >> m;
	int k = 0;
	for (int i = 0; i<m; ++i)
	{
		for (int j = 0; j < 2; ++j){
			cin >> v[i][j];
		}
		int aa = v[i][1] - 1, aa1 = v[i][0] - 1;
		a[aa1][aa] = 1;
		a[aa][aa1] = 1;

	}

	for (int i = 0; i<n; ++i){
		for (int j = 0; j<n; ++j){
			cout << a[i][j] << " ";
		}
		cout << endl;
	}
	return 0;
}


И что у вас за ужаснейшее именование aa, aa1 ?что дальше, aaa1 ?
BagaBaga
Дата: 10.03.2015 09:32:07
ванмомас намбаван,
Вы пишете на С? Тогда зачем вам cin и cout?
на С++? Тогда откуда достали stdin и stdout?
Что за паскалевская привычка объявлять все переменные в начале блока? (ладно-ладно, _старый_ С тоже требовал это...)

Вы задаёте матрицу фиксированного размера. Что будет, если на вход подадут граф бОльшей размерности? Что интересно, сам размер вы хоть и читаете, но даже не проверяете...
BagaBaga
Дата: 10.03.2015 09:34:54
И не злоупотребляйте оператором "," запятая. Не экономьте перевод каретки.
ванмомас намбаван
Дата: 11.03.2015 22:00:33
BagaBaga,я знаю какой размерности массив будет введен
ванмомас намбаван
Дата: 14.03.2015 11:47:27
BagaBaga,а почему нельзя юзать cin & cout?
BagaBaga
Дата: 16.03.2015 09:03:38
ванмомас намбаван,
cin и cout использовать, конечно же, можно. А вот смешивать ввод-вывод в стиле С (stdin, stdout) и C++ (cin, cout) не рекомендуется - черевато разными багами. Причём, неожиданными и плохо воспроизводимыми.
BagaBaga
Дата: 16.03.2015 09:05:56
ванмомас намбаван
BagaBaga,я знаю какой размерности массив будет введен

Тогда зачем вы эту самую размерность упорно читаете? ... если всё знаете ещё до компиляции.
ванмомас намбаван
...
...
	cin >> n>>m;
...

BagaBaga
Дата: 17.03.2015 00:01:09
Так понимаю,
эту задачу - http://informatics.mccme.ru/mod/statements/view3.php?id=359&chapterid=465
пытаетесь решить?
BagaBaga
Дата: 17.03.2015 20:44:22
Раз ТС больше интереса не проявляет, думаю, большого вреда от публикации (какого-то) решения - не будет. Решает задачу для условий из http://informatics.mccme.ru/mod/statements/view3.php?id=359&chapterid=465 , кроме одного: данные читаем со стандартного потока ввода, пишем на стандартный поток вывода.

 #include <iostream>

    //глобальные массивы - зло. Но в этом случае - самое оно.
    int adj_mtx[100][100];

    using namespace std;

    int main()
    {
        int num_edj    = 0;
        int num_vertex = 0;

        cin >> num_vertex
             >> num_edj;

        //рёбра обрабатываем по одному, num_edj штук. И сразу - в матрицу
        while(num_edj--){
            register int start;
            register int stop;

            cin >> start
                 >> stop;

            //пришлось использовать '--', ведь у нас по задаче
            //нумерация с 1, а индексы в массивах - с нуля...
            adj_mtx[--start][--stop] = 1;
            adj_mtx[stop][start]     = 1;
        }

        //вывод матрицы. Ваш КЭП.
        for(int i = 0; i < num_vertex; i++){
            for(int j = 0; j < num_vertex; j++){
                cout << adj_mtx[i][j] << ' ';
            }
            cout << endl;
        }
        // надеюсь, ошибок ввода-вывода не было - я их не обрабатывал.
        // Но для демки именно преобразования списка рёбер в матрицу смежности - сойдёт.
        return 0;
    }