【BFS】【NOIP普及组T3】绿洲

题目描述

在这里插入图片描述
输入
在这里插入图片描述
输出
在这里插入图片描述
样例输入
在这里插入图片描述
样例输出
在这里插入图片描述
数据范围限制
在这里插入图片描述


思路

考试的时候觉得这题是最短路,但是没想出来。。。听完题,嗯???BFS???(沉思一会) SPFA就是BFS啊!!!

枚举绿洲作为起点,算每一个点的最短路,然后每个点的最短路选max。


#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int ans[100100],l[200100][2],next[100100],lz[100100];
int d[100100],q[100100],v[100100],h,t;
int n,m,k,num;
void bfs(int x){
	memset(v,0,sizeof(v));
	memset(d,0X3f,sizeof(d));
	q[1]=x,h=0,t=1,d[x]=0;
	while(h++<t){
		int i=q[h];
		int z=next[i];
		while(z!=0){
			if(!v[l[z][0]]){
				v[l[z][0]]=1;
				q[++t]=l[z][0];
				d[q[t]]=min(d[q[t]],d[i]+1);//求最短路
			}
			z=l[z][1];
		}
	}//BFS
	for(int i=1;i<=n;i++)
		ans[i]=max(ans[i],d[i]);//记录每个点最长的最短路
}
int main(){
	//freopen("oasis.in","r",stdin);
	//freopen("oasis.out","w",stdout);
	scanf("%d%d%d",&n,&m,&k);
	for(int i=1;i<=k;i++)
		scanf("%d",&lz[i]);
	int x,y;
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		l[++num][0]=y;
		l[num][1]=next[x];
		next[x]=num;
		l[++num][0]=x;
		l[num][1]=next[y];
		next[y]=num;//链表
	}
	for(int i=1;i<=k;i++)//枚举绿洲
		bfs(lz[i]); 
	for(int i=1;i<=n;i++)
	    printf("%d ",ans[i]);
}
发布了45 篇原创文章 · 获赞 0 · 访问量 382

猜你喜欢

转载自blog.csdn.net/qq_39940018/article/details/102730305
今日推荐