参考题目
分析:
题目中点的个数和边数最大有2000个,如果用floyd肯定不行,因为是无权图,所以就用bfs来算就行了,每个点的搜索最多有O(n),因此搜索所有点就O(n^2)。
代码:
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;
const int inf=999999999;
int n,m,res;
int d[2005][2005];
bool used[2005];
vector<int>G[2005];
void bfs(int n){
queue<int>que;
que.push(n);
used[n]=true;
d[n][n]=0;
while(!que.empty()){
int v=que.front();
que.pop();
for(int i=0;i<G[v].size();i++){
if(used[G[v][i]]) continue;
int tmp=d[n][v]+1;
d[n][G[v][i]]=min(d[n][G[v][i]],tmp);
//printf("%d %d %d\n",d[n][G[v][i]],n,G[v][i]);
if(!used[G[v][i]]){
que.push(G[v][i]);
used[G[v][i]]=true;
}
}
}
}
int main(){
int a,b;
cin>>n>>m;
fill(d[0],d[0]+2005*2005,inf);
for(int i=0;i<m;i++){
cin>>a>>b;
G[a].push_back(b);
G[b].push_back(a);
}
for(int i=1;i<=n;i++){
fill(used,used+n+5,false);
bfs(i);
}
bool f=true;
int res=-1;
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
if(d[i][j]==inf) {
f=false;
break;
}
//printf("%d %d %d\n",d[i][j],i,j);
res=max(res,d[i][j]);
}
}
if(f) printf("=] %d\n",res);
else puts("=[");
return 0;
}