Нужно сделать так чтобы программа работала не только на с++, но и на си.
#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);
}