PAT--六度空間 (30)--vector數組表示圖

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章