Pagini recente » Monitorul de evaluare | Cod sursa (job #2848049) | Cod sursa (job #1170153) | Rating Paun Alex (AlexPaun) | Cod sursa (job #2741152)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef struct graphEdges {
int node;
struct graphEdges* neighbors;
int nr_neighbors;
} graphEdges;
int N, M, n = 0;
int stack[100001];
int indexStack = 1;
void push(int value)
{
stack[indexStack++] = value;
}
graphEdges* readGraphEdgeList(const char* fileName)
{
FILE* f = fopen(fileName, "r");
fscanf(f, "%d%d", &N, &M);
graphEdges* graph=(graphEdges*)malloc((N+1)*sizeof(graphEdges));
for (int i = 1; i <= N; i++)
{
graph[i].node = i;
graph[i].nr_neighbors = 0;
graph[i].neighbors = NULL;
}
int left, right;
for (int i = 0; i < M; i++) {
fscanf(f, "%d%d", &left,&right);
graph[left].nr_neighbors++;
graph[left].neighbors = (graphEdges*)realloc(graph[left].neighbors, (graph[left].nr_neighbors + 1) * sizeof(graphEdges));
graph[left].neighbors[graph[left].nr_neighbors - 1] = graph[right];
graph[right].nr_neighbors++;
graph[right].neighbors = (graphEdges*)realloc(graph[right].neighbors, (graph[right].nr_neighbors + 1) * sizeof(graphEdges));
graph[right].neighbors[graph[right].nr_neighbors - 1] = graph[left];
}
fclose(f);
return graph;
}
void dfs_edges(graphEdges* graph,int node,int* visited)
{
int k;
push(node);
visited[node] = -1;
while (indexStack != 1)
{
k = 0;
for (int i = 0; i < graph[node].nr_neighbors; i++)
if (visited[graph[node].neighbors[i].node] == 0)
{
k = 1;
visited[graph[node].neighbors[i].node] = 1;
push(graph[node].neighbors[i].node);
}
node = stack[indexStack - 1];
if (k == 0)
{
if (visited[node] == -1)
{
n++;
indexStack--;
stack[indexStack] = 0;
for (int i = node + 1; i <= N; i++)
if (visited[i] == 0)
dfs_edges(graph, i, visited);
}
else
{
indexStack--;
node = stack[indexStack - 1];
stack[indexStack] = 0;
}
}
}
}
int main()
{
graphEdges* graphE = readGraphEdgeList("dfs.in");
int* visited = (int*)calloc(N + 1, sizeof(int));
dfs_edges(graphE,1,visited);
FILE* f = fopen("dfs.out", "w");
fprintf(f, "%d", n);
fclose(f);
return 0;
}