http://www.patest.cn/contests/mooc-ds2015spring/06-图3
本来这题不想写出来的,但是,额自己犯了些错误,
主要是下标从1开始,自己没注意,呜呜。
另一点值得写的是用vector来表示图。
BFS中tail,last的关系:见最后的截图。
前三篇都是写BFS,DFS的。个人在这里还不熟,下面附上陈越老师的模板
//模板
void DFS(Vertex V){
visited[V]=true;
for(V的每个邻接点W)
if(!visited[W])
DFS(W);
}
void BFS(Vertex V){
//访问
visited[V]=true;
EnQueue(V,Q);
while(!isEmpty(Q)){
V = DeQueue(Q);
for(V的每个邻接点W)
if(!visited[W]){
//访问
visited[W]=true;
Enqueue(W,Q);
}
}
}
#include<stdio.h>
#include<memory.h>
#include<vector>
#include<queue>
#define ssize 10001
#define filee 0
using namespace std;
//vector来表示图
vector<int> map[ssize];
bool visited[ssize];
int number,edge;
queue<int> Q;
//注意下标从1开始,开始写0,害得我折腾了很长时间。。
void init(){
int i;
while(!Q.empty())Q.pop();
for(i=1;i<=number;i++)
visited[i]=false;
}
int BFS(int x){
int level=0,last=x,tail;
//计数
int count=1;
//一定记得初始化哦
init();//
Q.push(x);
visited[x]=true;
while(!Q.empty()){
int i;
int t=Q.front();
Q.pop();
int len=map[t].size();
for(i=0;i<len;i++){
int b=map[t][i];/一开始直接写if(!visited[i]).....
if(!visited[b]){
visited[b]=true;
//printf("level,t,b:%d %d %d\n",level,t,b);测试。。
Q.push(b);
//一定要想清楚count++在这里是否合适,可以保证所有符合
//条件节点都加了一遍,而且只加一遍。
//你看,level为0时,与节点1相接的(第一层)正好都加了
//所以level==6时就要跳出循环
count++;
tail=b;
}
}
//参考了陈越老师的PPT。
//last指向level层最后节点,last指向level+1层最后一个节点
if(t==last){
level++;last=tail;
}
if(level==6)
break;
}
return count;
}
int main(){
FILE *fp;
int i,t1,t2;
if(filee){
fp=fopen("in3.txt","r");
if(fp==NULL){
puts("fopen ERROR!");
return -1;
}
fscanf(fp,"%d%d",&number,&edge);
for(i=0;i<edge;i++){
fscanf(fp,"%d%d",&t1,&t2);
map[t1].push_back(t2);
map[t2].push_back(t1);
}
}
else{
scanf("%d%d",&number,&edge);
for(i=0;i<edge;i++){
scanf("%d%d",&t1,&t2);
map[t1].push_back(t2);
map[t2].push_back(t1);
}
}
for(i=1;i<=number;i++){
int count=BFS(i);
printf("%d: %.2lf%%\n",i,100.0*count/number);
}
return 0;
}