修改代码 #include<stdio.h> #include<stdlib.h> #define MAX 1005 int n,m; int G[MAX][MAX]; int vis[MAX]; int bfs(int s){ memset(vis,0,sizeof(vis)); int cnt=0,level=0; int head=0,tail=0; int que[MAX]; que[tail++]=s; vis[s]=1; while(head<tail&&level<=6){ int len=tail-head; while(len--){ int u=que[head++]; for(int v=1;v<=n;v++){ if(G[u][v]&&!vis[v]){ vis[v]=1; que[tail++]=v; cnt++; } } } level++; } return cnt; } int main(){ while(scanf("%d%d",&n,&m)==2&&n){ memset(G,0,sizeof(G)); for(int i=0;i<m;i++){ int u,v; scanf("%d%d",&u,&v); G[u][v]=G[v][u]=1; } for(int i=1;i<=n;i++){ int cnt=bfs(i); printf("%d:%.2f%%\n",i,cnt*100.0/n); } } return 0; } 输入样例: 在这里给出一组输入。例如: 10 9 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 8 1 2 2 3 3 4 4 5 5 6 6 7 7 8 9 10 0 0 输出样例: 在这里给出相应的输出。例如: 1: 70.00% 2: 80.00% 3: 90.00% 4: 100.00% 5: 100.00% 6: 100.00% 7: 100.00% 8: 90.00% 9: 80.00% 10: 70.00% 1: 70.00% 2: 80.00% 3: 80.00% 4: 80.00% 5: 80.00% 6: 80.00% 7: 80.00% 8: 70.00% 9: 20.00% 10: 20.00%
时间: 2024-01-06 19:06:57 浏览: 62
这段代码是一个计算六度空间理论的程序,对于输入的无向图,计算出每个顶点与其他顶点之间的最短路径长度,如果路径长度小于或等于6,则连接这两个顶点。最后,对于每个顶点,输出它与其他顶点之间的连接百分比。
代码本身没有问题,但是有一个小问题在于每次循环需要清空 vis 数组,但是每次循环都调用 bfs 函数,而 bfs 函数内部也需要清空 vis 数组,因此可以将 vis 数组的清空放在 bfs 函数内部。
修改后的代码如下:
```c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 1005
int n, m;
int G[MAX][MAX];
int bfs(int s){
int cnt=0, level=0;
int head=0, tail=0;
int que[MAX];
memset(que, 0, sizeof(que));
que[tail++]=s;
while(head<tail&&level<=6){
int len=tail-head;
while(len--){
int u=que[head++];
for(int v=1;v<=n;v++){
if(G[u][v]&&!que[v]){
que[v]=1;
cnt++;
if(level<6) que[tail++]=v;
}
}
}
level++;
}
return cnt;
}
int main(){
while(scanf("%d%d",&n,&m)==2&&n){
memset(G,0,sizeof(G));
for(int i=0;i<m;i++){
int u,v;
scanf("%d%d",&u,&v);
G[u][v]=G[v][u]=1;
}
for(int i=1;i<=n;i++){
int cnt=bfs(i);
printf("%d: %.2f%%\n",i,cnt*100.0/n);
}
}
return 0;
}
```
阅读全文