hdu4460 Friend Chains(记忆化广度优先搜索)
题意:
任意两点间最短路中的最长距离。
思路:
BFS遍历每个点能到达的最远距离。
Tips:
vector的clear要与resize联用。
#include <bits/stdc++.h> using namespace std; const int M=1100; int n,m; vector<vector<int>> v; int BFS(int s){ vector<vector<int>> d(M); bool vis[M]={0}; d[0].push_back(s); vis[s]=true; int ret=0,cnt=1; for(int i=0;i<n;i++){//遍历所有可能的距离 for(int j:d[i]){//遍历该距离中的点 for(int k:v[j]){//遍历该距离中的点能到达的点 if(!vis[k]){//若不处于之前任一距离中 d[i+1].push_back(k);//当前距离+1即为该点的最短距离 vis[k]=true; ++cnt; } } } if(d[i].size()) ret=i;//更新能到达的最远距离 } return cnt==n?ret:M;//若不能从该点出发到达所有点,返回M以输出-1 } int main(){ while(cin>>n&&n){ v.clear();//清空一切,不会保留原大小 v.resize(M); map<string,int> mp; for(int i=0;i<n;i++){ string s;cin>>s; mp[s]=i; } cin>>m; for(int i=0;i<m;i++){ string a,b;cin>>a>>b; v[mp[a]].push_back(mp[b]); v[mp[b]].push_back(mp[a]); } int k=0; for(int i=0;i<n;i++) k=max(k,BFS(i));//遍历以每个点为起点能到达的最远距离 if(k==M) cout<<"-1\n"; else cout<<k<<endl; } return 0; }