PAT--六度空间 (30)--vector数组表示图

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/grooowing/article/details/44902559

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


猜你喜欢

转载自blog.csdn.net/grooowing/article/details/44902559