Чем можно заменить , чтобы программа работала на си?

#define _CRT_SECURE_NO_WARNINGS
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <stdbool.h>
#include<vector>
#include<memory.h>

using namespace std;
int n, m;
vector<long> graph[100007];//сам граф
long visited[100007];
bool possible = true; // граф двудолен
void dfs(long v, int c) // v - вершина, c-цвет
{
    visited[v] = c; // красим вершину
    for (int j = 0; j < graph[v].size(); j++)
    {
        if (visited[graph[v][j]] == 0) //если вершина не покрашена
        {
            long new_colour;
            if (c == 1) // Меняем цвет
            {
                new_colour = 2;
            }
            else
            {
                new_colour = 1;
            }
            dfs(graph[v][j], new_colour); // Идем в другую вершину
        }
        if (visited[graph[v][j]] == c) // ребро соединяет вершины одинакового цвета,граф не двудолен
        {
            possible = false; // Не двудолен - значит не двудолен
        }
    }
}

int main()
{

    scanf("%d", &n);
    scanf("%d", &m);// n- количество вершин, m- количество ребер
    memset(visited, sizeof(visited), 0);
    for (int i = 1; i <= m; i++)
    {
        int p, q;
        scanf("%d", &p);
        scanf("%d", &q); // читаем ребро
        graph[p].push_back(q);
        graph[q].push_back(p);
    }
    for (int i = 1; i <= n; i++)
    {
        if (visited[i] == 0) // Если мы еще не посетили вершину
        {
            dfs(i, 1); // Идем ее красить
        }
    }
    if (!possible) // Граф не двудолен
    {
        printf("0");
        return 0;
    }
    printf("1");

    int s1=0;
    for (int i = 1; i <= n; i++)
    {
        if (visited[i] == 1) // Вершина покрашена в первый цвет
        {
            s1++;
        }
    }
    printf("\n");

    int s2 = 0;
    for (int i = 1; i <= n; i++)
    {
        if (visited[i] == 2) // Вершина покрашена во второй цвет
        {
            s2++;
        }
    }

    if (s1 >= s2) printf("%d", s2);
    else
        printf("%d", s1);
}

Ответы (1 шт):

Автор решения: AlexGlebe

Нашёл ошибочку : в memset(visited, sizeof(visited), 0); перепутали аргументы. Второй аргумент должен быть ноль, последний - количество байт. Примерно так правильно : memset(visited, 0, sizeof(visited));.

Переделал пока вектор на список. Времени нет на всё. Если у вас есть время, можете сами список перевести в Си. А если нет, то потерпите.

#define _CRT_SECURE_NO_WARNINGS
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <stdbool.h>
# include <list>
#include<memory.h>

using namespace std;
int n, m;
list  < long  > graph [ 100007  ] ; //сам граф
long visited[100007];
bool possible = true; // граф двудолен
void dfs(long v, int c) // v - вершина, c-цвет
{
    visited[v] = c; // красим вершину
    list  < long  > :: iterator j = graph[v].begin();
    for ( ; j not_eq graph[v].end() ; j++ )
    {
        if (visited [ * j ] == 0) //если вершина не покрашена
        {
            long new_colour;
            if (c == 1) // Меняем цвет
            {
                new_colour = 2;
            }
            else
            {
                new_colour = 1;
            }
            dfs ( * j , new_colour); // Идем в другую вершину
        }
        if (visited [ * j ] == c) // ребро соединяет вершины одинакового цвета,граф не двудолен
        {
            possible = false; // Не двудолен - значит не двудолен
        }
    }
}

int main()
{

    scanf("%d", &n);
    scanf("%d", &m);// n- количество вершин, m- количество ребер

    // ошибка : перепутали аргументы
    memset(visited, 0, sizeof(visited));

    for (int i = 1; i <= m; i++)
    {
        int p, q;
        scanf("%d", &p);
        scanf("%d", &q); // читаем ребро
        graph[p].push_back(q);

        // ошибка : не проверяем наличие дублей
        if ( p not_eq q )
          graph[q].push_back(p);
    }
    for (int i = 1; i <= n; i++)
    {
        if (visited[i] == 0) // Если мы еще не посетили вершину
        {
            dfs(i, 1); // Идем ее красить
        }
    }
    if (!possible) // Граф не двудолен
    {
        printf("0");
        return 0;
    }
    printf("1");

    int s1=0;
    for (int i = 1; i <= n; i++)
    {
        if (visited[i] == 1) // Вершина покрашена в первый цвет
        {
            s1++;
        }
    }
    printf("\n");

    int s2 = 0;
    for (int i = 1; i <= n; i++)
    {
        if (visited[i] == 2) // Вершина покрашена во второй цвет
        {
            s2++;
        }
    }

    if (s1 >= s2) printf("%d", s2);
    else
        printf("%d", s1);
}


Продолжение: перенос на Си стандарт 11. Всё компилируется.

#define _CRT_SECURE_NO_WARNINGS
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <stdbool.h>
#include<memory.h>
# include <iso646.h>

# define  list( N ) list_ ## N
# define  list_push_front( N ) list_ ## N ## _push_front

# define  deflist( N , T ) \
typedef struct  s_list_ ##  N list( N ) ; \
struct  s_list_ ##  N { \
  T val ; \
  list( N ) * next  ; } ; \
void  list_push_front( N ) ( list ( N ) * * const l , T const x ) {  \
  list(N) * const ll = (list(N) *)malloc(sizeof(list(N))); \
  ll -> val = x ; \
  ll -> next = * l ; \
  ( * l ) = ll ; }

deflist ( long , long int )

int n, m;
list  ( long  ) * graph [ 100007  ] ; //сам граф
long visited[100007];
bool possible = true; // граф двудолен
void dfs(long v, int c) // v - вершина, c-цвет
{
    visited[v] = c; // красим вершину
    list  ( long  ) * j = graph[v];
    for ( ; j ; j = j -> next )
    {
        if (visited [ j -> val ] == 0) //если вершина не покрашена
        {
            long new_colour;
            if (c == 1) // Меняем цвет
            {
                new_colour = 2;
            }
            else
            {
                new_colour = 1;
            }
            dfs ( j -> val , new_colour); // Идем в другую вершину
        }
        if (visited [ j -> val ] == c) // ребро соединяет вершины одинакового цвета,граф не двудолен
        {
            possible = false; // Не двудолен - значит не двудолен
        }
    }
}

int main()
{

    scanf("%d", &n);
    scanf("%d", &m);// n- количество вершин, m- количество ребер

    // ошибка : перепутали аргументы
    memset(visited, 0, sizeof(visited));

    for (int i = 1; i <= m; i++)
    {
        int p, q;
        scanf("%d", &p);
        scanf("%d", &q); // читаем ребро

        list_push_front( long ) ( & graph[p] , q ) ;

        // ошибка : не проверяем наличие дублей
        if ( p not_eq q ) 
          list_push_front( long ) ( & graph[q] , p ) ; 
    }
    for (int i = 1; i <= n; i++)
    {
        if (visited[i] == 0) // Если мы еще не посетили вершину
        {
            dfs(i, 1); // Идем ее красить
        }
    }
    if (!possible) // Граф не двудолен
    {
        printf("0");
        return 0;
    }
    printf("1");

    int s1=0;
    for (int i = 1; i <= n; i++)
    {
        if (visited[i] == 1) // Вершина покрашена в первый цвет
        {
            s1++;
        }
    }
    printf("\n");

    int s2 = 0;
    for (int i = 1; i <= n; i++)
    {
        if (visited[i] == 2) // Вершина покрашена во второй цвет
        {
            s2++;
        }
    }

    if (s1 >= s2) printf("%d", s2);
    else
        printf("%d", s1);
}
→ Ссылка