解题代码
#include<stdio.h>
#define MAXN 1000
#define MAXE 33000
int A[MAXN+1][MAXN+1], B[MAXN+1], Q[MAXN+1];
int N, front = -1, rear = -1;
typedef enum { false, true } bool;
void Clear(void);
int BFS(int index);
void Enqueue(int index);
bool IsEmpty(void);
int Dequeue();
int main()
{
int M, i, tx, ty, flag = 1, counter=0;
scanf("%d %d", &N, &M);
for (i = 0; i < M; i++) {
scanf("%d %d", &tx, &ty);
A[tx][ty] = 1;
}
for (i = 1; i <= N; i++) {
counter = BFS(i);
Clear();
if (flag) flag = 0;
else printf("\n");
printf("%d: %.2lf%%", i, (double)counter*100 / N);
}
return 0;
}
void Clear(void) {
for (int i = 1; i <= N; i++) {
B[i] = 0;
Q[i] = 0;
}
front = rear = -1;
}
int BFS(int index) {
int counter, V, i;
int layer = 0, last = index, tail;
counter = 1;
B[index] = 1;
Enqueue(index);
while (!IsEmpty()) {
V = Dequeue();
for (i = 1; i <= N; i++) {
if (!B[i] && (A[V][i] || A[i][V])) {
counter++;
B[i] = 1;
Enqueue(i);
tail = i;
}
}
if (V==last) {
last = tail;
layer++;
}
if (layer == 6) break;
}
return counter;
}
void Enqueue(int index) {
Q[++rear] = index;
}
bool IsEmpty(void) {
if (front == rear) return true;
else return false;
}
int Dequeue() {
return Q[++front];
}
测试结果
问题整理
1.注意BFS的逻辑,个人感觉BFS没有DFS好玩。。。
2.注意抛出值和每一层的last的关系。