洛谷: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);
}