Чем можно заменить , чтобы программа работала на си?
#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
Продолжение: перенос на Си стандарт 11. Всё компилируется.
→ Ссылка
Нашёл ошибочку : в 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);
}