Pagini recente » Istoria paginii runda/iconcurs15/clasament | Cod sursa (job #2728402) | Cod sursa (job #2481886) | Cod sursa (job #1411183) | Cod sursa (job #2741522)
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//EDGES
typedef struct edge
{
int leftNode;
int rightNode;
} edge;
typedef struct graphEdges
{
edge *edges;
int numNodes;
int numEdges;
} graphEdges;
int cnt = 0;
void dfs_edges(graphEdges graph, int currentNode, int *visited)
{
visited[currentNode] = 1;
for (int i = 0; i < graph.numNodes; i++)
{
if (graph.edges[i].leftNode == currentNode)
{
if (!visited[graph.edges[i].rightNode] && visited[graph.edges[i].leftNode])
{
cnt++;
dfs_edges(graph, graph.edges[i].rightNode, visited);
}
}
}
}
graphEdges readGraphEdgeList(const char *fileName)
{
graphEdges graph;
graph.numEdges = 0;
graph.edges = NULL;
graph.edges = (edge *)malloc(sizeof(edge) * 30);
FILE *f = fopen(fileName, "r");
if (f == NULL)
return graph;
char buff[200];
fgets(buff, 200, f);
char *p = strtok(buff, " \n\r");
graph.numNodes = atoi(p);
p = strtok(NULL, " \n\r");
graph.numEdges = atoi(p);
int i = 0;
while (!feof(f))
{
fgets(buff, 200, f);
p = strtok(buff, " \n\r");
graph.edges[i].leftNode = atoi(p);
p = strtok(NULL, " \n\r");
graph.edges[i].rightNode = atoi(p);
i++;
}
fclose(f);
return graph;
}
int main()
{
FILE *f = fopen("dfs.out", "w");
graphEdges graphE = readGraphEdgeList("dfs.in");
int visited2[100] = {0}; //we assume fewer than 100 nodes
dfs_edges(graphE, 1, visited2);
fprintf(f, "%d", cnt + 1);
}