struct Node
{
int color;
int distance;
int prev;
};
enum COLOR
{
WHITE, GRAY, BLACK
};
int BFS(int** matrix, int num_node,int source, int dest)
{
Node* node = new Node[num_node];
for (int i = 0; i < num_node; i++)
{
node[i].color = WHITE;
node[i].distance = 0x7fffffff;
node[i].prev = 0xffffffff;
}
queue<int> que;
int cur = source;
node[source].color = GRAY;
node[source].distance = 0;
que.push(cur);
while (!que.empty())
{
int cur = que.front();
que.pop();
for (int k = 0; k < num_node; k++)
{
if (matrix[cur][k] == 1 && node[k].color == WHITE)
{
que.push(k);
node[k].color = GRAY;
node[k].prev = cur;
node[k].distance = node[cur].distance + 1;
}
}
node[cur].color = BLACK;
}
printf("dis from %d to %d is %d\n", source, dest, node[dest].distance);
cur = dest;
printf("path is \n");
while (cur != source)
{
printf("%d\t", cur);
cur = node[cur].prev;
}
printf("%d\n", cur);
return node[dest].distance;
}
int main()
{
int num_node, num_vert;
int binary_vertex;
FILE* fp = fopen("input.txt", "r");
char buf[1024];
if (fscanf(fp, "%d %d %d\n", &num_node, &num_vert,&binary_vertex) != 3)
{
fprintf(stderr, "\nfscanf error: %s: %d\n", strerror(errno), errno);
exit(1);
}
int** matrix = new int*[num_node];
for (int i = 0; i < num_node; i++)
{
matrix[i] = new int[num_node];
memset(matrix[i], 0, num_node * sizeof(int));
}
while (fgets(buf, 1024, fp) != NULL)
{
int begin, end;
if (sscanf(buf, "%d %d\n", &begin, &end) != 2)
{
fprintf(stderr, "\nsscanf error: %s: %d\n", strerror(errno), errno);
exit(1);
}
if (binary_vertex == 1)
{
matrix[end][begin] = 1;
}
matrix[begin][end] = 1;
}
for (int i = 0; i < num_node; i++)
{
for (int j = 0; j < num_node; j++)
{
printf("%4d",matrix[i][j]);
}
printf("\n");
}
int source = 4;
int dest = 2;
int dis = BFS(matrix,num_node, source, dest);
return 0;
}
----------
DFS
----------
struct DFSNode
{
int color;
int prev;
int time_start;
int time_finish;
};
int time = 0;
void DFSVisit(int** matrix, DFSNode* node,int num_node,int node_index)
{
time++;
node[node_index].color = GRAY;
node[node_index].time_start = time;
for (int k = 0; k < num_node; k++)
{
if (node[k].color == WHITE&&matrix[node_index][k] == 1)
{
node[k].prev = node_index;
DFSVisit(matrix, node, num_node, k);
}
}
node[node_index].color = BLACK;
time++;
node[node_index].time_finish = time;
}
int DFS(int** matrix, int num_node, int source, int dest)
{
DFSNode* node = new DFSNode[num_node];
for (int i = 0; i < num_node; i++)
{
node[i].color = WHITE;
node[i].prev = 0xffffffff;
node[i].time_start = 0;
node[i].time_finish = 0;
}
for (int k = 1; k < num_node; k++)
{
if (node[k].color == WHITE)
{
DFSVisit(matrix, node,num_node, k);
}
}
//int cur = dest;
//printf("path is \n");
//while (cur != source)
//{
// printf("%d\t", cur);
// cur = node[cur].prev;
//}
//printf("%d\n", cur);
printf("time:\n");
for (int i = 1; i < num_node; i++)
{
printf("node %d: start = %d, finish = %d\n", i, node[i].time_start, node[i].time_finish);
}
return 0;
}