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;
}