l
i
n
k
\textcolor{gray}{link}
link
分析:
A
A
A图直径和
B
B
B图直径 求多源最短路 就是
m
a
x
{
d
i
s
i
}
max\{dis_i\}
max{disi}
如果求出的最小答案比直径还小
a
n
s
ans
ans就是直径
CODE:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#define inf 0x7fffffff
using namespace std;
typedef long long ll;
const int N=1005,M=1e4+5;
int n,m,n2,m2,tot,head[N],dis[N];
int max1,min1,max2,min2;
struct node{
int to,next;
}a[M<<1];
void add(int x,int y)
{
a[++tot]=(node){y,head[x]};
head[x]=tot;
}
void spfa(int st)
{
queue<int> q;
for(int i=1;i<=n;i++)
dis[i]=inf;
dis[st]=0;
q.push(st);
while(!q.empty())
{
int x=q.front();
q.pop();
for(int i=head[x];i;i=a[i].next)
{
int qwq=a[i].to;
if(dis[x]+1<dis[qwq])
{
dis[qwq]=dis[x]+1;
q.push(qwq);
}
}
}
}
void work(int &res1,int &res2)
{
scanf("%d%d",&n,&m);
tot=0;
memset(head,0,sizeof head);
res1=-1,res2=inf;
for(int i=1,x,y;i<=m;i++)
{
scanf("%d%d",&x,&y);
add(x+1,y+1); add(y+1,x+1);
}
for(int i=1;i<=n;i++)
{
int tmp=-1; spfa(i);
for(int j=1;j<=n;j++)
tmp=max(tmp,dis[j]);
res1=max(res1,tmp);
res2=min(res2,tmp);
}
}
int main()
{
work(max1,min1);
work(max2,min2);
if(min1+min2+1<max(max1,max2))
printf("%d %d\n",max(max1,max2),max1+max2+1);
else printf("%d %d\n",min1+min2+1,max1+max2+1);
return 0;
}