显示代码纯文本
#include<cstdio>
#include<iostream>
#include<cmath>
#include<deque>
using namespace std;
const int SIZEN=110,INF=0x7fffffff/2;
int N,M;
int P[SIZEN][SIZEN]={0};
int sw[SIZEN][SIZEN]={0};
int pre[SIZEN]={0};
int ma=INF;
int ct1,ct2;
void read()
{
scanf("%d%d",&N,&M);
int a,b;
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
sw[i][j]=INF,P[i][j]=INF;
for(int i=1;i<=N;i++) sw[i][i]=P[i][i]=0;
for(int i=1;i<=M;i++)
{
scanf("%d%d",&a,&b);
P[a][b]=P[b][a]=1;
sw[a][b]=sw[b][a]=1;
}
}
void floyed()
{
for(int k=1;k<=N;k++)
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++) sw[i][j]=min(sw[i][k]+sw[k][j],sw[i][j]);
}
void checkcentre(int x,int y)
{
int dat,D=0;
if(x==y) dat=0;
else dat=1;
for(int i=1;i<=N;i++) D=max(D,2*min(sw[x][i],sw[y][i])+dat);
if(D<ma)
{
ma=D;ct1=x;ct2=y;
}
}
void SPFA()
{
deque<int> Q;
int inq[SIZEN]={0};
int dist[SIZEN];
for(int i=1;i<=N;i++) dist[i]=INF;
dist[ct1]=dist[ct2]=0;
inq[ct1]=inq[ct2]=1;
Q.push_back(ct1);Q.push_back(ct2);
while(!Q.empty())
{
int x=Q.front();Q.pop_front();inq[x]=0;
for(int i=1;i<=N;i++)
{
if(dist[x]+P[x][i]<dist[i])
{
dist[i]=dist[x]+P[x][i];
pre[i]=x;
if(inq[i]==0)
{
inq[i]=1;
Q.push_back(i);
}
}
}
}
}
void work()
{
floyed();
for(int i=1;i<=N;i++)
for(int j=1;j<=N;j++)
{
if(P[i][j]<INF) checkcentre(i,j);
}
SPFA();
for(int i=1;i<=N;i++)
if(pre[i]) printf("%d %d\n",i,pre[i]);
if(ct1!=ct2)
printf("%d %d\n",ct1,ct2);
}
int main()
{
freopen("iset.in","r",stdin);
freopen("iset.out","w",stdout);
read();
work();
return 0;
}