USACO 2009 Open Silver 1.Hide and Seek 最短路水题

洛谷:https://www.luogu.com.cn/problem/P2951

最短路水题,基本上是一道裸题

跑一遍最短路,再遍历求出最大值、个数、最小编号即可。

注意:无向图边的数组要开成二倍!!!!

代码如下:

#include<stdio.h>
#include<queue>
#include<cstring>
using namespace std;
#define P 20001
#define C 100001
int head[P],v[C],to[C],nxt[C];
int dis[P];
bool inQ[P];
int num[P];
queue<int>q;
int tot=0;
void spfa(int s)
{
	memset(dis,0x3f3f,sizeof(dis));
	dis[s]=0;
	q.push(s);
	inQ[s]=1;
	while(!q.empty())
	{
		int p=q.front();
		q.pop();
		inQ[p]=0;
		for(int i=head[p];i;i=nxt[i])
		{
			int y=to[i];
			if(dis[y]>dis[p]+v[i])
			{
				dis[y]=dis[p]+v[i];
				if(inQ[y]==0)
				q.push(y),inQ[y]=1;
			}
		}
	}
}
void add(int x,int y,int z)
{
	v[++tot]=z;
	to[tot]=y;
	nxt[tot]=head[x];
	head[x]=tot;	
}
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	int x,y,z;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		add(x,y,1);
		add(y,x,1);
	}
	spfa(1);
	int ans=0;
	for(int i=1;i<=n;i++)
	{
		ans=max(ans,dis[i]);
	}
	int num=0;
	int flag=0;
	int cn;
	for(int i=1;i<=n;i++)
	{
		if(dis[i]==ans)
		num++;
		if(flag==0&&dis[i]==ans)
		flag=1,cn=i;	
	}
	printf("%d %d %d",cn,ans,num);
}

  

posted @ 2020-08-06 09:59  岚默笙  阅读(51)  评论(0编辑  收藏  举报