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